OSDN Git Service

a330fef5b70888977336d445b09eb2c53cf015ae
[pf3gnuchains/gcc-fork.git] / gcc / gcse.c
1 /* Global common subexpression elimination
2    and global constant/copy propagation for GNU compiler.
3    Copyright (C) 1997 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 /* TODO
23    - reordering of memory allocation and freeing to be more space efficient
24    - do rough calc of how many regs are needed in each block, and a rough
25      calc of how many regs are available in each class and use that to
26      throttle back the code in cases where RTX_COST is minimal.
27    - memory aliasing support
28    - ability to realloc sbitmap vectors would allow one initial computation
29      of reg_set_in_block with only subsequent additions, rather than
30      recomputing it for each pass
31
32    NOTES
33    - the classic gcse implementation is kept in for now for comparison
34 */
35
36 /* References searched while implementing this.
37    This list will eventually be deleted but I wanted to have a record of it
38    for now.
39
40    Compilers Principles, Techniques and Tools
41    Aho, Sethi, Ullman
42    Addison-Wesley, 1988
43
44    Global Optimization by Suppression of Partial Redundancies
45    E. Morel, C. Renvoise
46    communications of the acm, Vol. 22, Num. 2, Feb. 1979
47
48    A Portable Machine-Independent Global Optimizer - Design and Measurements
49    Frederick Chow
50    Stanford Ph.D. thesis, Dec. 1983
51
52 xxx
53    Elimination Algorithms for Data Flow Analysis
54    B.G. Ryder, M.C. Paull
55    ACM Computing Surveys, Vol. 18, Num. 3, Sep. 1986
56
57 reread
58    A Fast Algorithm for Code Movement Optimization
59    D.M. Dhamdhere
60    SIGPLAN Notices, Vol. 23, Num. 10, Oct. 1988
61
62    A Solution to a Problem with Morel and Renvoise's
63    Global Optimization by Suppression of Partial Redundancies
64    K-H Drechsler, M.P. Stadel
65    ACM TOPLAS, Vol. 10, Num. 4, Oct. 1988
66
67    Practical Adaptation of the Global Optimization
68    Algorithm of Morel and Renvoise
69    D.M. Dhamdhere
70    ACM TOPLAS, Vol. 13, Num. 2. Apr. 1991
71
72    Efficiently Computing Static Single Assignment Form and the Control
73    Dependence Graph
74    R. Cytron, J. Ferrante, B.K. Rosen, M.N. Wegman, and F.K. Zadeck
75    ACM TOPLAS, Vol. 13, Num. 4, Oct. 1991
76
77 yyy
78    How to Analyze Large Programs Efficiently and Informatively
79    D.M. Dhamdhere, B.K. Rosen, F.K. Zadeck
80    ACM SIGPLAN Notices Vol. 27, Num. 7, Jul. 1992, '92 Conference on PLDI
81
82    Lazy Code Motion
83    J. Knoop, O. Ruthing, B. Steffen
84    ACM SIGPLAN Notices Vol. 27, Num. 7, Jul. 1992, '92 Conference on PLDI
85
86    What's In a Region?  Or Computing Control Dependence Regions in Near-Linear
87    Time for Reducible Flow Control
88    Thomas Ball
89    ACM Letters on Programming Languages and Systems,
90    Vol. 2, Num. 1-4, Mar-Dec 1993
91
92    An Efficient Representation for Sparse Sets
93    Preston Briggs, Linda Torczon
94    ACM Letters on Programming Languages and Systems,
95    Vol. 2, Num. 1-4, Mar-Dec 1993
96
97    A Variation of Knoop, Ruthing, and Steffen's Lazy Code Motion
98    K-H Drechsler, M.P. Stadel
99    ACM SIGPLAN Notices, Vol. 28, Num. 5, May 1993
100
101    Partial Dead Code Elimination
102    J. Knoop, O. Ruthing, B. Steffen
103    ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
104
105    Effective Partial Redundancy Elimination
106    P. Briggs, K.D. Cooper
107    ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
108
109    The Program Structure Tree: Computing Control Regions in Linear Time
110    R. Johnson, D. Pearson, K. Pingali
111    ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
112
113    Optimal Code Motion: Theory and Practice
114    J. Knoop, O. Ruthing, B. Steffen
115    ACM TOPLAS, Vol. 16, Num. 4, Jul. 1994
116
117    The power of assignment motion
118    J. Knoop, O. Ruthing, B. Steffen
119    ACM SIGPLAN Notices Vol. 30, Num. 6, Jun. 1995, '95 Conference on PLDI
120
121    Global code motion / global value numbering
122    C. Click
123    ACM SIGPLAN Notices Vol. 30, Num. 6, Jun. 1995, '95 Conference on PLDI
124
125    Value Driven Redundancy Elimination
126    L.T. Simpson
127    Rice University Ph.D. thesis, Apr. 1996
128
129    Value Numbering
130    L.T. Simpson
131    Massively Scalar Compiler Project, Rice University, Sep. 1996
132
133    High Performance Compilers for Parallel Computing
134    Michael Wolfe
135    Addison-Wesley, 1996
136
137    People wishing to speed up the code here should read xxx, yyy.
138    People wishing to do something different can find various possibilities
139    in the above papers and elsewhere.
140 */
141
142 #include "config.h"
143 /* Must precede rtl.h for FFS.  */
144 #include "system.h"
145
146 #include "rtl.h"
147 #include "regs.h"
148 #include "hard-reg-set.h"
149 #include "flags.h"
150 #include "real.h"
151 #include "insn-config.h"
152 #include "recog.h"
153 #include "basic-block.h"
154 #include "output.h"
155
156 #include "obstack.h"
157 #define obstack_chunk_alloc gmalloc
158 #define obstack_chunk_free free
159
160 /* Maximum number of passes to perform.  */
161 #define MAX_PASSES 1
162
163 /* Propagate flow information through back edges and thus enable PRE's
164    moving loop invariant calculations out of loops.
165
166    Originally this tended to create worse overall code, but several
167    improvements during the development of PRE seem to have made following
168    back edges generally a win.
169
170    Note much of the loop invariant code motion done here would normally
171    be done by loop.c, which has more heuristics for when to move invariants
172    out of loops.  At some point we might need to move some of those
173    heuristics into gcse.c.  */
174 #define FOLLOW_BACK_EDGES 1
175
176 /* We support two GCSE implementations: Classic GCSE (i.e. Dragon Book)
177    and PRE (Partial Redundancy Elimination) GCSE (based on Fred Chow's thesis).
178    The default is PRE.
179
180    In either case we perform the following steps:
181
182    1) Compute basic block information.
183
184    2) Compute table of places where registers are set.
185
186    3) Perform copy/constant propagation.
187
188    4) Perform global cse.
189
190    5) Perform another pass of copy/constant propagation [only if PRE].
191
192    Two passes of copy/constant propagation are done because the first one
193    enables more GCSE and the second one helps to clean up the copies that
194    GCSE creates.  This is needed more for PRE than for Classic because Classic
195    GCSE will try to use an existing register containing the common
196    subexpression rather than create a new one.  This is harder to do for PRE
197    because of the code motion (which Classic GCSE doesn't do).
198
199    Expressions we are interested in GCSE-ing are of the form
200    (set (pseudo-reg) (expression)).
201    Function want_to_gcse_p says what these are.
202
203    PRE handles moving invariant expressions out of loops (by treating them as
204    partially redundant).  This feature of PRE is disabled here (by not
205    propagating dataflow information along back edges) because loop.c has more
206    involved (and thus typically better) heuristics for what to move out of
207    loops.
208
209    Eventually it would be nice to replace cse.c/gcse.c with SSA (static single
210    assignment) based GVN (global value numbering).  L. T. Simpson's paper
211    (Rice University) on value numbering is a useful reference for this.
212
213    **********************
214
215    We used to support multiple passes but there are diminishing returns in
216    doing so.  The first pass usually makes 90% of the changes that are doable.
217    A second pass can make a few more changes made possible by the first pass.
218    Experiments show any further passes don't make enough changes to justify
219    the expense.
220
221    A study of spec92 using an unlimited number of passes:
222    [1 pass] = 1208 substitutions, [2] = 577, [3] = 202, [4] = 192, [5] = 83,
223    [6] = 34, [7] = 17, [8] = 9, [9] = 4, [10] = 4, [11] = 2,
224    [12] = 2, [13] = 1, [15] = 1, [16] = 2, [41] = 1
225
226    It was found doing copy propagation between each pass enables further
227    substitutions.
228
229    PRE is quite expensive in complicated functions because the DFA can take
230    awhile to converge.  Hence we only perform one pass.  Macro MAX_PASSES can
231    be modified if one wants to experiment.
232
233    **********************
234
235    The steps for PRE are:
236
237    1) Build the hash table of expressions we wish to GCSE (expr_hash_table).
238
239    2) Perform the data flow analysis for PRE.
240
241    3) Delete the redundant instructions
242
243    4) Insert the required copies [if any] that make the partially
244       redundant instructions fully redundant.
245
246    5) For other reaching expressions, insert an instruction to copy the value
247       to a newly created pseudo that will reach the redundant instruction.
248
249    The deletion is done first so that when we do insertions we
250    know which pseudo reg to use.
251
252    Various papers have argued that PRE DFA is expensive (O(n^2)) and others
253    argue it is not.  The number of iterations for the algorithm to converge
254    is typically 2-4 so I don't view it as that expensive (relatively speaking).
255
256    PRE GCSE depends heavily on the seconds CSE pass to clean up the copies
257    we create.  To make an expression reach the place where it's redundant,
258    the result of the expression is copied to a new register, and the redundant
259    expression is deleted by replacing it with this new register.  Classic GCSE
260    doesn't have this problem as much as it computes the reaching defs of
261    each register in each block and thus can try to use an existing register.
262
263    **********************
264
265    When -fclassic-gcse, we perform a classic global CSE pass.
266    It is based on the algorithms in the Dragon book, and is based on code
267    written by Devor Tevi at Intel.
268
269    The steps for Classic GCSE are:
270
271    1) Build the hash table of expressions we wish to GCSE (expr_hash_table).
272       Also recorded are reaching definition "gen" statements (rd_gen)
273
274    2) Compute the reaching definitions (reaching_defs).
275       This is a bitmap for each basic block indexed by INSN_CUID that is 1
276       for each statement containing a definition that reaches the block.
277
278    3) Compute the available expressions (ae_in).
279       This is a bitmap for each basic block indexed by expression number
280       that is 1 for each expression that is available at the beginning of
281       the block.
282
283    4) Perform GCSE.
284       This is done by scanning each instruction looking for sets of the form
285       (set (pseudo-reg) (expression)) and checking if `expression' is in the
286       hash table.  If it is, and if the expression is available, and if only
287       one computation of the expression reaches the instruction, we substitute
288       the expression for a register containing its value.  If there is no
289       such register, but the expression is expensive enough we create an
290       instruction to copy the result of the expression into and use that.
291
292    **********************
293
294    A fair bit of simplicity is created by creating small functions for simple
295    tasks, even when the function is only called in one place.  This may
296    measurably slow things down [or may not] by creating more function call
297    overhead than is necessary.  The source is laid out so that it's trivial
298    to make the affected functions inline so that one can measure what speed
299    up, if any, can be achieved, and maybe later when things settle things can
300    be rearranged.
301
302    Help stamp out big monolithic functions!  */
303 \f
304 /* GCSE global vars.  */
305
306 /* -dG dump file.  */
307 static FILE *gcse_file;
308
309 /* Bitmaps are normally not included in debugging dumps.
310    However it's useful to be able to print them from GDB.
311    We could create special functions for this, but it's simpler to
312    just allow passing stderr to the dump_foo fns.  Since stderr can
313    be a macro, we store a copy here.  */
314 static FILE *debug_stderr;
315
316 /* An obstack for our working variables.  */
317 static struct obstack gcse_obstack;
318
319 /* Non-zero for each mode that supports (set (reg) (reg)).
320    This is trivially true for integer and floating point values.
321    It may or may not be true for condition codes.  */
322 static char can_copy_p[(int) NUM_MACHINE_MODES];
323
324 /* Non-zero if can_copy_p has been initialized.  */
325 static int can_copy_init_p;
326
327 /* Element I is a list of I's predecessors/successors.  */
328 static int_list_ptr *s_preds;
329 static int_list_ptr *s_succs;
330
331 /* Element I is the number of predecessors/successors of basic block I.  */
332 static int *num_preds;
333 static int *num_succs;
334
335 /* Hash table of expressions.  */
336
337 struct expr
338 {
339   /* The expression (SET_SRC for expressions, PATTERN for assignments).  */
340   rtx expr;
341   /* Index in the available expression bitmaps.  */
342   int bitmap_index;
343   /* Next entry with the same hash.  */
344   struct expr *next_same_hash;
345   /* List of anticipatable occurrences in basic blocks in the function.
346      An "anticipatable occurrence" is one that is the first occurrence in the
347      basic block and the operands are not modified in the basic block prior
348      to the occurrence.  */
349   struct occr *antic_occr;
350   /* List of available occurrence in basic blocks in the function.
351      An "available occurrence" is one that is the last occurrence in the
352      basic block and the operands are not modified by following statements in
353      the basic block [including this insn].  */
354   struct occr *avail_occr;
355   /* Non-null if the computation is PRE redundant.
356      The value is the newly created pseudo-reg to record a copy of the
357      expression in all the places that reach the redundant copy.  */
358   rtx reaching_reg;
359 };
360
361 /* Occurrence of an expression.
362    There is one per basic block.  If a pattern appears more than once the
363    last appearance is used [or first for anticipatable expressions].  */
364
365 struct occr
366 {
367   /* Next occurrence of this expression.  */
368   struct occr *next;
369   /* The insn that computes the expression.  */
370   rtx insn;
371   /* Non-zero if this [anticipatable] occurrence has been deleted.  */
372   char deleted_p;
373   /* Non-zero if this [available] occurrence has been copied to
374      reaching_reg.  */
375   /* ??? This is mutually exclusive with deleted_p, so they could share
376      the same byte.  */
377   char copied_p;
378 };
379
380 /* Expression and copy propagation hash tables.
381    Each hash table is an array of buckets.
382    ??? It is known that if it were an array of entries, structure elements
383    `next_same_hash' and `bitmap_index' wouldn't be necessary.  However, it is
384    not clear whether in the final analysis a sufficient amount of memory would
385    be saved as the size of the available expression bitmaps would be larger
386    [one could build a mapping table without holes afterwards though].
387    Someday I'll perform the computation and figure it out.
388 */
389
390 /* Total size of the expression hash table, in elements.  */
391 static int expr_hash_table_size;
392 /* The table itself.
393    This is an array of `expr_hash_table_size' elements.  */
394 static struct expr **expr_hash_table;
395
396 /* Total size of the copy propagation hash table, in elements.  */
397 static int set_hash_table_size;
398 /* The table itself.
399    This is an array of `set_hash_table_size' elements.  */
400 static struct expr **set_hash_table;
401
402 /* Mapping of uids to cuids.
403    Only real insns get cuids.  */
404 static int *uid_cuid;
405
406 /* Highest UID in UID_CUID.  */
407 static int max_uid;
408
409 /* Get the cuid of an insn.  */
410 #define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)])
411
412 /* Number of cuids.  */
413 static int max_cuid;
414
415 /* Mapping of cuids to insns.  */
416 static rtx *cuid_insn;
417
418 /* Get insn from cuid.  */
419 #define CUID_INSN(CUID) (cuid_insn[CUID])
420
421 /* Maximum register number in function prior to doing gcse + 1.
422    Registers created during this pass have regno >= max_gcse_regno.
423    This is named with "gcse" to not collide with global of same name.  */
424 static int max_gcse_regno;
425
426 /* Maximum number of cse-able expressions found.  */
427 static int n_exprs;
428 /* Maximum number of assignments for copy propagation found.  */
429 static int n_sets;
430
431 /* Table of registers that are modified.
432    For each register, each element is a list of places where the pseudo-reg
433    is set.
434
435    For simplicity, GCSE is done on sets of pseudo-regs only.  PRE GCSE only
436    requires knowledge of which blocks kill which regs [and thus could use
437    a bitmap instead of the lists `reg_set_table' uses].  The classic GCSE
438    uses the information in lists.
439
440    If the classic GCSE pass is deleted `reg_set_table' and could be turned
441    into an array of bitmaps (num-bbs x num-regs)
442    [however perhaps it may be useful to keep the data as is].
443    One advantage of recording things this way is that `reg_set_table' is
444    fairly sparse with respect to pseudo regs but for hard regs could be
445    fairly dense [relatively speaking].
446    And recording sets of pseudo-regs in lists speeds
447    up functions like compute_transp since in the case of pseudo-regs we only
448    need to iterate over the number of times a pseudo-reg is set, not over the
449    number of basic blocks [clearly there is a bit of a slow down in the cases
450    where a pseudo is set more than once in a block, however it is believed
451    that the net effect is to speed things up].  This isn't done for hard-regs
452    because recording call-clobbered hard-regs in `reg_set_table' at each
453    function call can consume a fair bit of memory, and iterating over hard-regs
454    stored this way in compute_transp will be more expensive.  */
455
456 typedef struct reg_set {
457   /* The next setting of this register.  */
458   struct reg_set *next;
459   /* The insn where it was set.  */
460   rtx insn;
461 } reg_set;
462 static reg_set **reg_set_table;
463 /* Size of `reg_set_table'.
464    The table starts out at max_gcse_regno + slop, and is enlarged as
465    necessary.  */
466 static int reg_set_table_size;
467 /* Amount to grow `reg_set_table' by when it's full.  */
468 #define REG_SET_TABLE_SLOP 100
469
470 /* Bitmap containing one bit for each register in the program.
471    Used when performing GCSE to track which registers have been set since
472    the start of the basic block.  */
473 static sbitmap reg_set_bitmap;
474
475 /* For each block, a bitmap of registers set in the block.
476    This is used by expr_killed_p and compute_transp.
477    It is computed during hash table computation and not by compute_sets
478    as it includes registers added since the last pass (or between cprop and
479    gcse) and it's currently not easy to realloc sbitmap vectors.  */
480 static sbitmap *reg_set_in_block;
481
482 /* For each block, non-zero if memory is set in that block.
483    This is computed during hash table computation and is used by
484    expr_killed_p and compute_transp.
485    ??? Handling of memory is very simple, we don't make any attempt
486    to optimize things (later).
487    ??? This can be computed by compute_sets since the information
488    doesn't change.  */
489 static char *mem_set_in_block;
490
491 /* Various variables for statistics gathering.  */
492
493 /* Memory used in a pass.
494    This isn't intended to be absolutely precise.  Its intent is only
495    to keep an eye on memory usage.  */
496 static int bytes_used;
497 /* GCSE substitutions made.  */
498 static int gcse_subst_count;
499 /* Number of copy instructions created.  */
500 static int gcse_create_count;
501 /* Number of constants propagated.  */
502 static int const_prop_count;
503 /* Number of copys propagated.  */
504 static int copy_prop_count;
505
506 extern char *current_function_name;
507 extern int current_function_calls_setjmp;
508 extern int current_function_calls_longjmp;
509 \f
510 /* These variables are used by classic GCSE.
511    Normally they'd be defined a bit later, but `rd_gen' needs to
512    be declared sooner.  */
513
514 /* A bitmap of all ones for implementing the algorithm for available
515    expressions and reaching definitions.  */
516 /* ??? Available expression bitmaps have a different size than reaching
517    definition bitmaps.  This should be the larger of the two, however, it
518    is not currently used for reaching definitions.  */
519 static sbitmap u_bitmap;
520
521 /* Each block has a bitmap of each type.
522    The length of each blocks bitmap is:
523
524        max_cuid  - for reaching definitions
525        n_exprs - for available expressions
526
527    Thus we view the bitmaps as 2 dimensional arrays.  i.e.
528    rd_kill[block_num][cuid_num]
529    ae_kill[block_num][expr_num]
530 */
531
532 /* For reaching defs */
533 static sbitmap *rd_kill, *rd_gen, *reaching_defs, *rd_out;
534
535 /* for available exprs */
536 static sbitmap *ae_kill, *ae_gen, *ae_in, *ae_out;
537 \f
538 static void compute_can_copy          PROTO ((void));
539
540 static char *gmalloc                  PROTO ((unsigned int));
541 static char *grealloc                 PROTO ((char *, unsigned int));
542 static char *gcse_alloc               PROTO ((unsigned long));
543 static void alloc_gcse_mem            PROTO ((rtx));
544 static void free_gcse_mem             PROTO ((void));
545 extern void dump_cuid_table           PROTO ((FILE *));
546
547 static void alloc_reg_set_mem         PROTO ((int));
548 static void free_reg_set_mem          PROTO ((void));
549 static void record_one_set            PROTO ((int, rtx));
550 static void record_set_info           PROTO ((rtx, rtx));
551 static void compute_sets              PROTO ((rtx));
552
553 static void hash_scan_insn            PROTO ((rtx, int, int));
554 static void hash_scan_set             PROTO ((rtx, rtx, int));
555 static void hash_scan_clobber         PROTO ((rtx, rtx));
556 static void hash_scan_call            PROTO ((rtx, rtx));
557 static void maybe_set_rd_gen          PROTO ((int, rtx));
558 static int want_to_gcse_p             PROTO ((rtx));
559 static int oprs_unchanged_p           PROTO ((rtx, rtx, int));
560 static int oprs_anticipatable_p       PROTO ((rtx, rtx));
561 static int oprs_available_p           PROTO ((rtx, rtx));
562 static void insert_expr_in_table      PROTO ((rtx, enum machine_mode, rtx, int, int));
563 static void insert_set_in_table       PROTO ((rtx, rtx));
564 static unsigned int hash_expr         PROTO ((rtx, enum machine_mode, int *, int));
565 static unsigned int hash_expr_1       PROTO ((rtx, enum machine_mode, int *));
566 static unsigned int hash_set          PROTO ((int, int));
567 static int expr_equiv_p               PROTO ((rtx, rtx));
568 static void record_last_reg_set_info  PROTO ((rtx, int));
569 static void record_last_mem_set_info  PROTO ((rtx));
570 static void record_last_set_info      PROTO ((rtx, rtx));
571 static void compute_hash_table        PROTO ((rtx, int));
572 static void alloc_set_hash_table      PROTO ((int));
573 static void free_set_hash_table       PROTO ((void));
574 static void compute_set_hash_table    PROTO ((rtx));
575 static void alloc_expr_hash_table     PROTO ((int));
576 static void free_expr_hash_table      PROTO ((void));
577 static void compute_expr_hash_table   PROTO ((rtx));
578 static void dump_hash_table           PROTO ((FILE *, char *, struct expr **, int, int));
579 static struct expr *lookup_expr       PROTO ((rtx));
580 static struct expr *lookup_set        PROTO ((int, rtx));
581 static struct expr *next_set          PROTO ((int, struct expr *));
582 static void reset_opr_set_tables      PROTO ((void));
583 static int oprs_not_set_p             PROTO ((rtx, rtx));
584 static void mark_call                 PROTO ((rtx, rtx));
585 static void mark_set                  PROTO ((rtx, rtx));
586 static void mark_clobber              PROTO ((rtx, rtx));
587 static void mark_oprs_set             PROTO ((rtx));
588
589 static void alloc_rd_mem              PROTO ((int, int));
590 static void free_rd_mem               PROTO ((void));
591 static void compute_kill_rd           PROTO ((void));
592 static void handle_rd_kill_set        PROTO ((rtx, int, int));
593 static void compute_rd                PROTO ((void));
594 extern void dump_rd_table             PROTO ((FILE *, char *, sbitmap *));
595
596 static void alloc_avail_expr_mem      PROTO ((int, int));
597 static void free_avail_expr_mem       PROTO ((void));
598 static void compute_ae_gen            PROTO ((void));
599 static void compute_ae_kill           PROTO ((void));
600 static int expr_killed_p              PROTO ((rtx, int));
601 static void compute_available         PROTO ((void));
602
603 static int expr_reaches_here_p        PROTO ((struct occr *, struct expr *,
604                                               int, int, char *));
605 static rtx computing_insn             PROTO ((struct expr *, rtx));
606 static int def_reaches_here_p         PROTO ((rtx, rtx));
607 static int can_disregard_other_sets   PROTO ((struct reg_set **, rtx, int));
608 static int handle_avail_expr          PROTO ((rtx, struct expr *));
609 static int classic_gcse               PROTO ((void));
610 static int one_classic_gcse_pass      PROTO ((rtx, int));
611
612 static void alloc_cprop_mem           PROTO ((int, int));
613 static void free_cprop_mem            PROTO ((void));
614 extern void dump_cprop_data           PROTO ((FILE *));
615 static void compute_transp            PROTO ((rtx, int, sbitmap *, int));
616 static void compute_cprop_local_properties PROTO ((void));
617 static void compute_cprop_avinout     PROTO ((void));
618 static void compute_cprop_data        PROTO ((void));
619 static void find_used_regs            PROTO ((rtx));
620 static int try_replace_reg            PROTO ((rtx, rtx, rtx));
621 static struct expr *find_avail_set    PROTO ((int, rtx));
622 static int cprop_insn                 PROTO ((rtx));
623 static int cprop                      PROTO ((void));
624 static int one_cprop_pass             PROTO ((rtx, int));
625
626 static void alloc_pre_mem             PROTO ((int, int));
627 static void free_pre_mem              PROTO ((void));
628 extern void dump_pre_data             PROTO ((FILE *));
629 static void compute_pre_local_properties PROTO ((void));
630 static void compute_pre_avinout       PROTO ((void));
631 static void compute_pre_antinout      PROTO ((void));
632 static void compute_pre_pavinout      PROTO ((void));
633 static void compute_pre_ppinout       PROTO ((void));
634 static void compute_pre_data          PROTO ((void));
635 static int pre_expr_reaches_here_p    PROTO ((struct occr *, struct expr *,
636                                               int, char *));
637 static void pre_insert_insn           PROTO ((struct expr *, int));
638 static void pre_insert                PROTO ((struct expr **));
639 static void pre_insert_copy_insn      PROTO ((struct expr *, rtx));
640 static void pre_insert_copies         PROTO ((void));
641 static int pre_delete                 PROTO ((void));
642 static int pre_gcse                   PROTO ((void));
643 static int one_pre_gcse_pass          PROTO ((rtx, int));
644
645 static void add_label_notes           PROTO ((rtx, rtx));
646 \f
647 /* Entry point for global common subexpression elimination.
648    F is the first instruction in the function.  */
649
650 void
651 gcse_main (f, file)
652      rtx f;
653      FILE *file;
654 {
655   int changed, pass;
656   /* Bytes used at start of pass.  */
657   int initial_bytes_used;
658   /* Maximum number of bytes used by a pass.  */
659   int max_pass_bytes;
660   /* Point to release obstack data from for each pass.  */
661   char *gcse_obstack_bottom;
662
663   /* It's impossible to construct a correct control flow graph in the
664      presense of setjmp, so just punt to be safe.  */
665   if (current_function_calls_setjmp)
666     return;
667    
668   /* For calling dump_foo fns from gdb.  */
669   debug_stderr = stderr;
670
671   max_gcse_regno = max_reg_num ();
672   find_basic_blocks (f, max_gcse_regno, file);
673
674   /* Return if there's nothing to do.  */
675   if (n_basic_blocks <= 1)
676     {
677       /* Free storage allocated by find_basic_blocks.  */
678       free_basic_block_vars (0);
679       return;
680     }
681
682   /* See what modes support reg/reg copy operations.  */
683   if (! can_copy_init_p)
684     {
685       compute_can_copy ();
686       can_copy_init_p = 1;
687     }
688
689   gcc_obstack_init (&gcse_obstack);
690
691   gcse_file = file;
692
693   /* Allocate and compute predecessors/successors.  */
694
695   s_preds = (int_list_ptr *) alloca (n_basic_blocks * sizeof (int_list_ptr));
696   s_succs = (int_list_ptr *) alloca (n_basic_blocks * sizeof (int_list_ptr));
697   num_preds = (int *) alloca (n_basic_blocks * sizeof (int));
698   num_succs = (int *) alloca (n_basic_blocks * sizeof (int));
699   bytes_used = 4 * n_basic_blocks * sizeof (int_list_ptr);
700   compute_preds_succs (s_preds, s_succs, num_preds, num_succs);
701
702   if (file)
703     {
704       dump_bb_data (file, s_preds, s_succs);
705     }
706
707   /* Record where pseudo-registers are set.
708      This data is kept accurate during each pass.
709      ??? We could also record hard-reg and memory information here
710      [since it's unchanging], however it is currently done during
711      hash table computation.  */
712
713   alloc_reg_set_mem (max_gcse_regno);
714   compute_sets (f);
715
716   pass = 0;
717   initial_bytes_used = bytes_used;
718   max_pass_bytes = 0;
719   gcse_obstack_bottom = gcse_alloc (1);
720   changed = 1;
721   while (changed && pass < MAX_PASSES)
722     {
723       changed = 0;
724       if (file)
725         fprintf (file, "GCSE pass %d\n\n", pass + 1);
726
727       /* Initialize bytes_used to the space for the pred/succ lists,
728          and the reg_set_table data.  */
729       bytes_used = initial_bytes_used;
730
731       /* Each pass may create new registers, so recalculate each time.  */
732       max_gcse_regno = max_reg_num ();
733
734       alloc_gcse_mem (f);
735
736       changed = one_cprop_pass (f, pass + 1);
737
738       if (optimize_size)
739         changed |= one_classic_gcse_pass (f, pass + 1);
740       else
741         changed |= one_pre_gcse_pass (f, pass + 1);
742
743       if (max_pass_bytes < bytes_used)
744         max_pass_bytes = bytes_used;
745
746       free_gcse_mem ();
747
748       if (file)
749         {
750           fprintf (file, "\n");
751           fflush (file);
752         }
753       obstack_free (&gcse_obstack, gcse_obstack_bottom);
754       pass++;
755     }
756
757   /* If we're doing PRE, do one last pass of copy propagation.  */
758   if (! optimize_size)
759     {
760       max_gcse_regno = max_reg_num ();
761       alloc_gcse_mem (f);
762       one_cprop_pass (f, pass + 1);
763       free_gcse_mem ();
764     }
765
766   if (file)
767     {
768       fprintf (file, "GCSE of %s: %d basic blocks, ",
769                current_function_name, n_basic_blocks);
770       fprintf (file, "%d pass%s, %d bytes\n\n",
771                pass, pass > 1 ? "es" : "", max_pass_bytes);
772     }
773
774   /* Free our obstack.  */
775   obstack_free (&gcse_obstack, NULL_PTR);
776   /* Free reg_set_table.  */
777   free_reg_set_mem ();
778   /* Free storage used to record predecessor/successor data.  */
779   free_bb_mem ();
780   /* Free storage allocated by find_basic_blocks.  */
781   free_basic_block_vars (0);
782 }
783 \f
784 /* Misc. utilities.  */
785
786 /* Compute which modes support reg/reg copy operations.  */
787
788 static void
789 compute_can_copy ()
790 {
791   int i;
792 #ifndef AVOID_CCMODE_COPIES
793   rtx reg,insn;
794 #endif
795   char *free_point = (char *) oballoc (1);
796
797   bzero (can_copy_p, NUM_MACHINE_MODES);
798
799   start_sequence ();
800   for (i = 0; i < NUM_MACHINE_MODES; i++)
801     {
802       switch (GET_MODE_CLASS (i))
803         {
804         case MODE_CC :
805 #ifdef AVOID_CCMODE_COPIES
806           can_copy_p[i] = 0;
807 #else
808           reg = gen_rtx_REG ((enum machine_mode) i, LAST_VIRTUAL_REGISTER + 1);
809           insn = emit_insn (gen_rtx_SET (VOIDmode, reg, reg));
810           if (recog (PATTERN (insn), insn, NULL_PTR) >= 0)
811             can_copy_p[i] = 1;
812 #endif
813           break;
814         default :
815           can_copy_p[i] = 1;
816           break;
817         }
818     }
819   end_sequence ();
820
821   /* Free the objects we just allocated.  */
822   obfree (free_point);
823 }
824 \f
825 /* Cover function to xmalloc to record bytes allocated.  */
826
827 static char *
828 gmalloc (size)
829      unsigned int size;
830 {
831   bytes_used += size;
832   return xmalloc (size);
833 }
834
835 /* Cover function to xrealloc.
836    We don't record the additional size since we don't know it.
837    It won't affect memory usage stats much anyway.  */
838
839 static char *
840 grealloc (ptr, size)
841      char *ptr;
842      unsigned int size;
843 {
844   return xrealloc (ptr, size);
845 }
846
847 /* Cover function to obstack_alloc.
848    We don't need to record the bytes allocated here since
849    obstack_chunk_alloc is set to gmalloc.  */
850
851 static char *
852 gcse_alloc (size)
853      unsigned long size;
854 {
855   return (char *) obstack_alloc (&gcse_obstack, size);
856 }
857
858 /* Allocate memory for the cuid mapping array,
859    and reg/memory set tracking tables.
860
861    This is called at the start of each pass.  */
862
863 static void
864 alloc_gcse_mem (f)
865      rtx f;
866 {
867   int i,n;
868   rtx insn;
869
870   /* Find the largest UID and create a mapping from UIDs to CUIDs.
871      CUIDs are like UIDs except they increase monotonically, have no gaps,
872      and only apply to real insns.  */
873
874   max_uid = get_max_uid ();
875   n = (max_uid + 1) * sizeof (int);
876   uid_cuid = (int *) gmalloc (n);
877   bzero ((char *) uid_cuid, n);
878   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
879     {
880       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
881         INSN_CUID (insn) = i++;
882       else
883         INSN_CUID (insn) = i;
884     }
885
886   /* Create a table mapping cuids to insns.  */
887
888   max_cuid = i;
889   n = (max_cuid + 1) * sizeof (rtx);
890   cuid_insn = (rtx *) gmalloc (n);
891   bzero ((char *) cuid_insn, n);
892   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
893     {
894       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
895         {
896           CUID_INSN (i) = insn;
897           i++;
898         }
899     }
900
901   /* Allocate vars to track sets of regs.  */
902
903   reg_set_bitmap = (sbitmap) sbitmap_alloc (max_gcse_regno);
904
905   /* Allocate vars to track sets of regs, memory per block.  */
906
907   reg_set_in_block = (sbitmap *) sbitmap_vector_alloc (n_basic_blocks,
908                                                        max_gcse_regno);
909   mem_set_in_block = (char *) gmalloc (n_basic_blocks);
910 }
911
912 /* Free memory allocated by alloc_gcse_mem.  */
913
914 static void
915 free_gcse_mem ()
916 {
917   free (uid_cuid);
918   free (cuid_insn);
919
920   free (reg_set_bitmap);
921
922   free (reg_set_in_block);
923   free (mem_set_in_block);
924 }
925
926 void
927 dump_cuid_table (file)
928      FILE *file;
929 {
930   int i;
931
932   fprintf (file, "CUID table\n");
933   for (i = 0; i < max_cuid; i++)
934     {
935       rtx insn = CUID_INSN (i);
936       if (i != 0 && i % 10 == 0)
937         fprintf (file, "\n");
938       if (insn != NULL)
939         fprintf (file, " %d", INSN_UID (insn));
940     }
941   fprintf (file, "\n\n");
942 }
943 \f
944 /* Register set information.
945
946    `reg_set_table' records where each register is set or otherwise
947    modified.  */
948
949 static struct obstack reg_set_obstack;
950
951 static void
952 alloc_reg_set_mem (n_regs)
953      int n_regs;
954 {
955   int n;
956
957   reg_set_table_size = n_regs + REG_SET_TABLE_SLOP;
958   n = reg_set_table_size * sizeof (struct reg_set *);
959   reg_set_table = (struct reg_set **) gmalloc (n);
960   bzero ((char *) reg_set_table, n);
961
962   gcc_obstack_init (&reg_set_obstack);
963 }
964
965 static void
966 free_reg_set_mem ()
967 {
968   free (reg_set_table);
969   obstack_free (&reg_set_obstack, NULL_PTR);
970 }
971
972 /* Record REGNO in the reg_set table.  */
973
974 static void
975 record_one_set (regno, insn)
976      int regno;
977      rtx insn;
978 {
979   /* allocate a new reg_set element and link it onto the list */
980   struct reg_set *new_reg_info, *reg_info_ptr1, *reg_info_ptr2;
981
982   /* If the table isn't big enough, enlarge it.  */
983   if (regno >= reg_set_table_size)
984     {
985       int new_size = regno + REG_SET_TABLE_SLOP;
986       reg_set_table = (struct reg_set **)
987         grealloc ((char *) reg_set_table,
988                   new_size * sizeof (struct reg_set *));
989       bzero ((char *) (reg_set_table + reg_set_table_size),
990              (new_size - reg_set_table_size) * sizeof (struct reg_set *));
991       reg_set_table_size = new_size;
992     }
993
994   new_reg_info = (struct reg_set *) obstack_alloc (&reg_set_obstack,
995                                                    sizeof (struct reg_set));
996   bytes_used += sizeof (struct reg_set);
997   new_reg_info->insn = insn;
998   new_reg_info->next = NULL;
999   if (reg_set_table[regno] == NULL)
1000     reg_set_table[regno] = new_reg_info;
1001   else
1002     {
1003       reg_info_ptr1 = reg_info_ptr2 = reg_set_table[regno];
1004       /* ??? One could keep a "last" pointer to speed this up.  */
1005       while (reg_info_ptr1 != NULL)
1006         {
1007           reg_info_ptr2 = reg_info_ptr1;
1008           reg_info_ptr1 = reg_info_ptr1->next;
1009         }
1010       reg_info_ptr2->next = new_reg_info;
1011     }
1012 }
1013
1014 /* For communication between next two functions (via note_stores).  */
1015 static rtx record_set_insn;
1016
1017 /* Called from compute_sets via note_stores to handle one
1018    SET or CLOBBER in an insn.  */
1019
1020 static void
1021 record_set_info (dest, setter)
1022      rtx dest, setter ATTRIBUTE_UNUSED;
1023 {
1024   if (GET_CODE (dest) == SUBREG)
1025     dest = SUBREG_REG (dest);
1026
1027   if (GET_CODE (dest) == REG)
1028     {
1029       if (REGNO (dest) >= FIRST_PSEUDO_REGISTER)
1030         record_one_set (REGNO (dest), record_set_insn);
1031     }
1032 }
1033
1034 /* Scan the function and record each set of each pseudo-register.
1035
1036    This is called once, at the start of the gcse pass.
1037    See the comments for `reg_set_table' for further docs.  */
1038
1039 static void
1040 compute_sets (f)
1041      rtx f;
1042 {
1043   rtx insn = f;
1044
1045   while (insn)
1046     {
1047       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
1048         {
1049           record_set_insn = insn;
1050           note_stores (PATTERN (insn), record_set_info);
1051         }
1052       insn = NEXT_INSN (insn);
1053     }
1054 }
1055 \f
1056 /* Hash table support.  */
1057
1058 #define NEVER_SET -1
1059
1060 /* For each register, the cuid of the first/last insn in the block to set it,
1061    or -1 if not set.  */
1062 static int *reg_first_set;
1063 static int *reg_last_set;
1064
1065 /* While computing "first/last set" info, this is the CUID of first/last insn
1066    to set memory or -1 if not set.  `mem_last_set' is also used when
1067    performing GCSE to record whether memory has been set since the beginning
1068    of the block.
1069    Note that handling of memory is very simple, we don't make any attempt
1070    to optimize things (later).  */
1071 static int mem_first_set;
1072 static int mem_last_set;
1073
1074 /* Set the appropriate bit in `rd_gen' [the gen for reaching defs] if the
1075    register set in this insn is not set after this insn in this block.  */
1076
1077 static void
1078 maybe_set_rd_gen (regno, insn)
1079      int regno;
1080      rtx insn;
1081 {
1082   if (reg_last_set[regno] <= INSN_CUID (insn))
1083     SET_BIT (rd_gen[BLOCK_NUM (insn)], INSN_CUID (insn));
1084 }
1085
1086 /* Perform a quick check whether X, the source of a set, is something
1087    we want to consider for GCSE.  */
1088
1089 static int
1090 want_to_gcse_p (x)
1091      rtx x;
1092 {
1093   enum rtx_code code = GET_CODE (x);
1094
1095   switch (code)
1096     {
1097     case REG:
1098     case SUBREG:
1099     case CONST_INT:
1100     case CONST_DOUBLE:
1101     case CALL:
1102       return 0;
1103
1104     default:
1105       break;
1106     }
1107
1108   return 1;
1109 }
1110
1111 /* Return non-zero if the operands of expression X are unchanged from the
1112    start of INSN's basic block up to but not including INSN (if AVAIL_P == 0),
1113    or from INSN to the end of INSN's basic block (if AVAIL_P != 0).  */
1114
1115 static int
1116 oprs_unchanged_p (x, insn, avail_p)
1117      rtx x, insn;
1118      int avail_p;
1119 {
1120   int i;
1121   enum rtx_code code;
1122   char *fmt;
1123
1124   /* repeat is used to turn tail-recursion into iteration.  */
1125  repeat:
1126
1127   if (x == 0)
1128     return 1;
1129
1130   code = GET_CODE (x);
1131   switch (code)
1132     {
1133     case REG:
1134       if (avail_p)
1135         return (reg_last_set[REGNO (x)] == NEVER_SET
1136                 || reg_last_set[REGNO (x)] < INSN_CUID (insn));
1137       else
1138         return (reg_first_set[REGNO (x)] == NEVER_SET
1139                 || reg_first_set[REGNO (x)] >= INSN_CUID (insn));
1140
1141     case MEM:
1142       if (avail_p)
1143         {
1144           if (mem_last_set != NEVER_SET
1145               && mem_last_set >= INSN_CUID (insn))
1146             return 0;
1147         }
1148       else
1149         {
1150           if (mem_first_set != NEVER_SET
1151               && mem_first_set < INSN_CUID (insn))
1152             return 0;
1153         }
1154       x = XEXP (x, 0);
1155       goto repeat;
1156
1157     case PRE_DEC:
1158     case PRE_INC:
1159     case POST_DEC:
1160     case POST_INC:
1161       return 0;
1162
1163     case PC:
1164     case CC0: /*FIXME*/
1165     case CONST:
1166     case CONST_INT:
1167     case CONST_DOUBLE:
1168     case SYMBOL_REF:
1169     case LABEL_REF:
1170     case ADDR_VEC:
1171     case ADDR_DIFF_VEC:
1172       return 1;
1173
1174     default:
1175       break;
1176     }
1177
1178   i = GET_RTX_LENGTH (code) - 1;
1179   fmt = GET_RTX_FORMAT (code);
1180   for (; i >= 0; i--)
1181     {
1182       if (fmt[i] == 'e')
1183         {
1184           rtx tem = XEXP (x, i);
1185
1186           /* If we are about to do the last recursive call
1187              needed at this level, change it into iteration.
1188              This function is called enough to be worth it.  */
1189           if (i == 0)
1190             {
1191               x = tem;
1192               goto repeat;
1193             }
1194           if (! oprs_unchanged_p (tem, insn, avail_p))
1195             return 0;
1196         }
1197       else if (fmt[i] == 'E')
1198         {
1199           int j;
1200           for (j = 0; j < XVECLEN (x, i); j++)
1201             {
1202               if (! oprs_unchanged_p (XVECEXP (x, i, j), insn, avail_p))
1203                 return 0;
1204             }
1205         }
1206     }
1207
1208   return 1;
1209 }
1210
1211 /* Return non-zero if the operands of expression X are unchanged from
1212    the start of INSN's basic block up to but not including INSN.  */
1213
1214 static int
1215 oprs_anticipatable_p (x, insn)
1216      rtx x, insn;
1217 {
1218   return oprs_unchanged_p (x, insn, 0);
1219 }
1220
1221 /* Return non-zero if the operands of expression X are unchanged from
1222    INSN to the end of INSN's basic block.  */
1223
1224 static int
1225 oprs_available_p (x, insn)
1226      rtx x, insn;
1227 {
1228   return oprs_unchanged_p (x, insn, 1);
1229 }
1230
1231 /* Hash expression X.
1232    MODE is only used if X is a CONST_INT.
1233    A boolean indicating if a volatile operand is found or if the expression
1234    contains something we don't want to insert in the table is stored in
1235    DO_NOT_RECORD_P.
1236
1237    ??? One might want to merge this with canon_hash.  Later.  */
1238
1239 static unsigned int
1240 hash_expr (x, mode, do_not_record_p, hash_table_size)
1241      rtx x;
1242      enum machine_mode mode;
1243      int *do_not_record_p;
1244      int hash_table_size;
1245 {
1246   unsigned int hash;
1247
1248   *do_not_record_p = 0;
1249
1250   hash = hash_expr_1 (x, mode, do_not_record_p);
1251   return hash % hash_table_size;
1252 }
1253
1254 /* Subroutine of hash_expr to do the actual work.  */
1255
1256 static unsigned int
1257 hash_expr_1 (x, mode, do_not_record_p)
1258      rtx x;
1259      enum machine_mode mode;
1260      int *do_not_record_p;
1261 {
1262   int i, j;
1263   unsigned hash = 0;
1264   enum rtx_code code;
1265   char *fmt;
1266
1267   /* repeat is used to turn tail-recursion into iteration.  */
1268  repeat:
1269
1270   if (x == 0)
1271     return hash;
1272
1273   code = GET_CODE (x);
1274   switch (code)
1275     {
1276     case REG:
1277       {
1278         register int regno = REGNO (x);
1279         hash += ((unsigned) REG << 7) + regno;
1280         return hash;
1281       }
1282
1283     case CONST_INT:
1284       {
1285         unsigned HOST_WIDE_INT tem = INTVAL (x);
1286         hash += ((unsigned) CONST_INT << 7) + (unsigned) mode + tem;
1287         return hash;
1288       }
1289
1290     case CONST_DOUBLE:
1291       /* This is like the general case, except that it only counts
1292          the integers representing the constant.  */
1293       hash += (unsigned) code + (unsigned) GET_MODE (x);
1294       if (GET_MODE (x) != VOIDmode)
1295         for (i = 2; i < GET_RTX_LENGTH (CONST_DOUBLE); i++)
1296           {
1297             unsigned tem = XINT (x, i);
1298             hash += tem;
1299           }
1300       else
1301         hash += ((unsigned) CONST_DOUBLE_LOW (x)
1302                  + (unsigned) CONST_DOUBLE_HIGH (x));
1303       return hash;
1304
1305       /* Assume there is only one rtx object for any given label.  */
1306     case LABEL_REF:
1307       /* We don't hash on the address of the CODE_LABEL to avoid bootstrap
1308          differences and differences between each stage's debugging dumps.  */
1309       hash += ((unsigned) LABEL_REF << 7) + CODE_LABEL_NUMBER (XEXP (x, 0));
1310       return hash;
1311
1312     case SYMBOL_REF:
1313       {
1314         /* Don't hash on the symbol's address to avoid bootstrap differences.
1315            Different hash values may cause expressions to be recorded in
1316            different orders and thus different registers to be used in the
1317            final assembler.  This also avoids differences in the dump files
1318            between various stages.  */
1319         unsigned int h = 0;
1320         unsigned char *p = (unsigned char *) XSTR (x, 0);
1321         while (*p)
1322           h += (h << 7) + *p++; /* ??? revisit */
1323         hash += ((unsigned) SYMBOL_REF << 7) + h;
1324         return hash;
1325       }
1326
1327     case MEM:
1328       if (MEM_VOLATILE_P (x))
1329         {
1330           *do_not_record_p = 1;
1331           return 0;
1332         }
1333       hash += (unsigned) MEM;
1334       x = XEXP (x, 0);
1335       goto repeat;
1336
1337     case PRE_DEC:
1338     case PRE_INC:
1339     case POST_DEC:
1340     case POST_INC:
1341     case PC:
1342     case CC0:
1343     case CALL:
1344     case UNSPEC_VOLATILE:
1345       *do_not_record_p = 1;
1346       return 0;
1347
1348     case ASM_OPERANDS:
1349       if (MEM_VOLATILE_P (x))
1350         {
1351           *do_not_record_p = 1;
1352           return 0;
1353         }
1354
1355     default:
1356       break;
1357     }
1358
1359   i = GET_RTX_LENGTH (code) - 1;
1360   hash += (unsigned) code + (unsigned) GET_MODE (x);
1361   fmt = GET_RTX_FORMAT (code);
1362   for (; i >= 0; i--)
1363     {
1364       if (fmt[i] == 'e')
1365         {
1366           rtx tem = XEXP (x, i);
1367
1368           /* If we are about to do the last recursive call
1369              needed at this level, change it into iteration.
1370              This function is called enough to be worth it.  */
1371           if (i == 0)
1372             {
1373               x = tem;
1374               goto repeat;
1375             }
1376           hash += hash_expr_1 (tem, 0, do_not_record_p);
1377           if (*do_not_record_p)
1378             return 0;
1379         }
1380       else if (fmt[i] == 'E')
1381         for (j = 0; j < XVECLEN (x, i); j++)
1382           {
1383             hash += hash_expr_1 (XVECEXP (x, i, j), 0, do_not_record_p);
1384             if (*do_not_record_p)
1385               return 0;
1386           }
1387       else if (fmt[i] == 's')
1388         {
1389           register unsigned char *p = (unsigned char *) XSTR (x, i);
1390           if (p)
1391             while (*p)
1392               hash += *p++;
1393         }
1394       else if (fmt[i] == 'i')
1395         {
1396           register unsigned tem = XINT (x, i);
1397           hash += tem;
1398         }
1399       else
1400         abort ();
1401     }
1402
1403   return hash;
1404 }
1405
1406 /* Hash a set of register REGNO.
1407
1408    Sets are hashed on the register that is set.
1409    This simplifies the PRE copy propagation code.
1410
1411    ??? May need to make things more elaborate.  Later, as necessary.  */
1412
1413 static unsigned int
1414 hash_set (regno, hash_table_size)
1415      int regno;
1416      int hash_table_size;
1417 {
1418   unsigned int hash;
1419
1420   hash = regno;
1421   return hash % hash_table_size;
1422 }
1423
1424 /* Return non-zero if exp1 is equivalent to exp2.
1425    ??? Borrowed from cse.c.  Might want to remerge with cse.c.  Later.  */
1426
1427 static int
1428 expr_equiv_p (x, y)
1429      rtx x, y;
1430 {
1431   register int i, j;
1432   register enum rtx_code code;
1433   register char *fmt;
1434
1435   if (x == y)
1436     return 1;
1437   if (x == 0 || y == 0)
1438     return x == y;
1439
1440   code = GET_CODE (x);
1441   if (code != GET_CODE (y))
1442     return 0;
1443
1444   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.  */
1445   if (GET_MODE (x) != GET_MODE (y))
1446     return 0;
1447
1448   switch (code)
1449     {
1450     case PC:
1451     case CC0:
1452       return x == y;
1453
1454     case CONST_INT:
1455       return INTVAL (x) == INTVAL (y);
1456
1457     case LABEL_REF:
1458       return XEXP (x, 0) == XEXP (y, 0);
1459
1460     case SYMBOL_REF:
1461       return XSTR (x, 0) == XSTR (y, 0);
1462
1463     case REG:
1464       return REGNO (x) == REGNO (y);
1465
1466     /*  For commutative operations, check both orders.  */
1467     case PLUS:
1468     case MULT:
1469     case AND:
1470     case IOR:
1471     case XOR:
1472     case NE:
1473     case EQ:
1474       return ((expr_equiv_p (XEXP (x, 0), XEXP (y, 0))
1475                && expr_equiv_p (XEXP (x, 1), XEXP (y, 1)))
1476               || (expr_equiv_p (XEXP (x, 0), XEXP (y, 1))
1477                   && expr_equiv_p (XEXP (x, 1), XEXP (y, 0))));
1478
1479     default:
1480       break;
1481     }
1482
1483   /* Compare the elements.  If any pair of corresponding elements
1484      fail to match, return 0 for the whole thing.  */
1485
1486   fmt = GET_RTX_FORMAT (code);
1487   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1488     {
1489       switch (fmt[i])
1490         {
1491         case 'e':
1492           if (! expr_equiv_p (XEXP (x, i), XEXP (y, i)))
1493             return 0;
1494           break;
1495
1496         case 'E':
1497           if (XVECLEN (x, i) != XVECLEN (y, i))
1498             return 0;
1499           for (j = 0; j < XVECLEN (x, i); j++)
1500             if (! expr_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j)))
1501               return 0;
1502           break;
1503
1504         case 's':
1505           if (strcmp (XSTR (x, i), XSTR (y, i)))
1506             return 0;
1507           break;
1508
1509         case 'i':
1510           if (XINT (x, i) != XINT (y, i))
1511             return 0;
1512           break;
1513
1514         case 'w':
1515           if (XWINT (x, i) != XWINT (y, i))
1516             return 0;
1517         break;
1518
1519         case '0':
1520           break;
1521
1522         default:
1523           abort ();
1524         }
1525       }
1526
1527   return 1;
1528 }
1529
1530 /* Insert expression X in INSN in the hash table.
1531    If it is already present, record it as the last occurrence in INSN's
1532    basic block.
1533
1534    MODE is the mode of the value X is being stored into.
1535    It is only used if X is a CONST_INT.
1536
1537    ANTIC_P is non-zero if X is an anticipatable expression.
1538    AVAIL_P is non-zero if X is an available expression.  */
1539
1540 static void
1541 insert_expr_in_table (x, mode, insn, antic_p, avail_p)
1542      rtx x;
1543      enum machine_mode mode;
1544      rtx insn;
1545      int antic_p, avail_p;
1546 {
1547   int found, do_not_record_p;
1548   unsigned int hash;
1549   struct expr *cur_expr, *last_expr = NULL;
1550   struct occr *antic_occr, *avail_occr;
1551   struct occr *last_occr = NULL;
1552
1553   hash = hash_expr (x, mode, &do_not_record_p, expr_hash_table_size);
1554
1555   /* Do not insert expression in table if it contains volatile operands,
1556      or if hash_expr determines the expression is something we don't want
1557      to or can't handle.  */
1558   if (do_not_record_p)
1559     return;
1560
1561   cur_expr = expr_hash_table[hash];
1562   found = 0;
1563
1564   while (cur_expr && ! (found = expr_equiv_p (cur_expr->expr, x)))
1565     {
1566       /* If the expression isn't found, save a pointer to the end of
1567          the list.  */
1568       last_expr = cur_expr;
1569       cur_expr = cur_expr->next_same_hash;
1570     }
1571
1572   if (! found)
1573     {
1574       cur_expr = (struct expr *) gcse_alloc (sizeof (struct expr));
1575       bytes_used += sizeof (struct expr);
1576       if (expr_hash_table[hash] == NULL)
1577         {
1578           /* This is the first pattern that hashed to this index.  */
1579           expr_hash_table[hash] = cur_expr;
1580         }
1581       else
1582         {
1583           /* Add EXPR to end of this hash chain.  */
1584           last_expr->next_same_hash = cur_expr;
1585         }
1586       /* Set the fields of the expr element.  */ 
1587       cur_expr->expr = x;
1588       cur_expr->bitmap_index = n_exprs++;
1589       cur_expr->next_same_hash = NULL;
1590       cur_expr->antic_occr = NULL;
1591       cur_expr->avail_occr = NULL;
1592     }
1593
1594   /* Now record the occurrence(s).  */
1595
1596   if (antic_p)
1597     {
1598       antic_occr = cur_expr->antic_occr;
1599
1600       /* Search for another occurrence in the same basic block.  */
1601       while (antic_occr && BLOCK_NUM (antic_occr->insn) != BLOCK_NUM (insn))
1602         {
1603           /* If an occurrence isn't found, save a pointer to the end of
1604              the list.  */
1605           last_occr = antic_occr;
1606           antic_occr = antic_occr->next;
1607         }
1608
1609       if (antic_occr)
1610         {
1611           /* Found another instance of the expression in the same basic block.
1612              Prefer the currently recorded one.  We want the first one in the
1613              block and the block is scanned from start to end.  */
1614           ; /* nothing to do */
1615         }
1616       else
1617         {
1618           /* First occurrence of this expression in this basic block.  */
1619           antic_occr = (struct occr *) gcse_alloc (sizeof (struct occr));
1620           bytes_used += sizeof (struct occr);
1621           /* First occurrence of this expression in any block?  */
1622           if (cur_expr->antic_occr == NULL)
1623             cur_expr->antic_occr = antic_occr;
1624           else
1625             last_occr->next = antic_occr;
1626           antic_occr->insn = insn;
1627           antic_occr->next = NULL;
1628         }
1629     }
1630
1631   if (avail_p)
1632     {
1633       avail_occr = cur_expr->avail_occr;
1634
1635       /* Search for another occurrence in the same basic block.  */
1636       while (avail_occr && BLOCK_NUM (avail_occr->insn) != BLOCK_NUM (insn))
1637         {
1638           /* If an occurrence isn't found, save a pointer to the end of
1639              the list.  */
1640           last_occr = avail_occr;
1641           avail_occr = avail_occr->next;
1642         }
1643
1644       if (avail_occr)
1645         {
1646           /* Found another instance of the expression in the same basic block.
1647              Prefer this occurrence to the currently recorded one.  We want
1648              the last one in the block and the block is scanned from start
1649              to end.  */
1650           avail_occr->insn = insn;
1651         }
1652       else
1653         {
1654           /* First occurrence of this expression in this basic block.  */
1655           avail_occr = (struct occr *) gcse_alloc (sizeof (struct occr));
1656           bytes_used += sizeof (struct occr);
1657           /* First occurrence of this expression in any block?  */
1658           if (cur_expr->avail_occr == NULL)
1659             cur_expr->avail_occr = avail_occr;
1660           else
1661             last_occr->next = avail_occr;
1662           avail_occr->insn = insn;
1663           avail_occr->next = NULL;
1664         }
1665     }
1666 }
1667
1668 /* Insert pattern X in INSN in the hash table.
1669    X is a SET of a reg to either another reg or a constant.
1670    If it is already present, record it as the last occurrence in INSN's
1671    basic block.  */
1672
1673 static void
1674 insert_set_in_table (x, insn)
1675      rtx x;
1676      rtx insn;
1677 {
1678   int found;
1679   unsigned int hash;
1680   struct expr *cur_expr, *last_expr = NULL;
1681   struct occr *cur_occr, *last_occr = NULL;
1682
1683   if (GET_CODE (x) != SET
1684       || GET_CODE (SET_DEST (x)) != REG)
1685     abort ();
1686
1687   hash = hash_set (REGNO (SET_DEST (x)), set_hash_table_size);
1688
1689   cur_expr = set_hash_table[hash];
1690   found = 0;
1691
1692   while (cur_expr && ! (found = expr_equiv_p (cur_expr->expr, x)))
1693     {
1694       /* If the expression isn't found, save a pointer to the end of
1695          the list.  */
1696       last_expr = cur_expr;
1697       cur_expr = cur_expr->next_same_hash;
1698     }
1699
1700   if (! found)
1701     {
1702       cur_expr = (struct expr *) gcse_alloc (sizeof (struct expr));
1703       bytes_used += sizeof (struct expr);
1704       if (set_hash_table[hash] == NULL)
1705         {
1706           /* This is the first pattern that hashed to this index.  */
1707           set_hash_table[hash] = cur_expr;
1708         }
1709       else
1710         {
1711           /* Add EXPR to end of this hash chain.  */
1712           last_expr->next_same_hash = cur_expr;
1713         }
1714       /* Set the fields of the expr element.
1715          We must copy X because it can be modified when copy propagation is
1716          performed on its operands.  */
1717       /* ??? Should this go in a different obstack?  */
1718       cur_expr->expr = copy_rtx (x);
1719       cur_expr->bitmap_index = n_sets++;
1720       cur_expr->next_same_hash = NULL;
1721       cur_expr->antic_occr = NULL;
1722       cur_expr->avail_occr = NULL;
1723     }
1724
1725   /* Now record the occurrence.  */
1726
1727   cur_occr = cur_expr->avail_occr;
1728
1729   /* Search for another occurrence in the same basic block.  */
1730   while (cur_occr && BLOCK_NUM (cur_occr->insn) != BLOCK_NUM (insn))
1731     {
1732       /* If an occurrence isn't found, save a pointer to the end of
1733          the list.  */
1734       last_occr = cur_occr;
1735       cur_occr = cur_occr->next;
1736     }
1737
1738   if (cur_occr)
1739     {
1740       /* Found another instance of the expression in the same basic block.
1741          Prefer this occurrence to the currently recorded one.  We want
1742          the last one in the block and the block is scanned from start
1743          to end.  */
1744       cur_occr->insn = insn;
1745     }
1746   else
1747     {
1748       /* First occurrence of this expression in this basic block.  */
1749       cur_occr = (struct occr *) gcse_alloc (sizeof (struct occr));
1750       bytes_used += sizeof (struct occr);
1751       /* First occurrence of this expression in any block?  */
1752       if (cur_expr->avail_occr == NULL)
1753         cur_expr->avail_occr = cur_occr;
1754       else
1755         last_occr->next = cur_occr;
1756       cur_occr->insn = insn;
1757       cur_occr->next = NULL;
1758     }
1759 }
1760
1761 /* Scan pattern PAT of INSN and add an entry to the hash table.
1762    If SET_P is non-zero, this is for the assignment hash table,
1763    otherwise it is for the expression hash table.  */
1764
1765 static void
1766 hash_scan_set (pat, insn, set_p)
1767      rtx pat, insn;
1768      int set_p;
1769 {
1770   rtx src = SET_SRC (pat);
1771   rtx dest = SET_DEST (pat);
1772
1773   if (GET_CODE (src) == CALL)
1774     hash_scan_call (src, insn);
1775
1776   if (GET_CODE (dest) == REG)
1777     {
1778       int regno = REGNO (dest);
1779       rtx tmp;
1780
1781       /* Only record sets of pseudo-regs in the hash table.  */
1782       if (! set_p
1783           && regno >= FIRST_PSEUDO_REGISTER
1784           /* Don't GCSE something if we can't do a reg/reg copy.  */
1785           && can_copy_p [GET_MODE (dest)]
1786           /* Is SET_SRC something we want to gcse?  */
1787           && want_to_gcse_p (src))
1788         {
1789           /* An expression is not anticipatable if its operands are
1790              modified before this insn.  */
1791           int antic_p = ! optimize_size && oprs_anticipatable_p (src, insn);
1792           /* An expression is not available if its operands are
1793              subsequently modified, including this insn.  */
1794           int avail_p = oprs_available_p (src, insn);
1795           insert_expr_in_table (src, GET_MODE (dest), insn, antic_p, avail_p);
1796         }
1797       /* Record sets for constant/copy propagation.  */
1798       else if (set_p
1799                && regno >= FIRST_PSEUDO_REGISTER
1800                && ((GET_CODE (src) == REG
1801                     && REGNO (src) >= FIRST_PSEUDO_REGISTER
1802                     && can_copy_p [GET_MODE (dest)])
1803                    /* ??? CONST_INT:wip */
1804                    || GET_CODE (src) == CONST_INT)
1805                /* A copy is not available if its src or dest is subsequently
1806                   modified.  Here we want to search from INSN+1 on, but
1807                   oprs_available_p searches from INSN on.  */
1808                && (insn == BLOCK_END (BLOCK_NUM (insn))
1809                    || ((tmp = next_nonnote_insn (insn)) != NULL_RTX
1810                        && oprs_available_p (pat, tmp))))
1811         insert_set_in_table (pat, insn);
1812     }
1813
1814   /* Check if first/last set in this block for classic gcse,
1815      but not for copy/constant propagation.  */
1816   if (optimize_size && !set_p)
1817       
1818     {
1819       rtx dest = SET_DEST (pat);
1820
1821       while (GET_CODE (dest) == SUBREG
1822              || GET_CODE (dest) == ZERO_EXTRACT
1823              || GET_CODE (dest) == SIGN_EXTRACT
1824              || GET_CODE (dest) == STRICT_LOW_PART)
1825         dest = XEXP (dest, 0);
1826       if (GET_CODE (dest) == REG)
1827         maybe_set_rd_gen (REGNO (dest), insn);
1828     }
1829 }
1830
1831 static void
1832 hash_scan_clobber (x, insn)
1833      rtx x ATTRIBUTE_UNUSED, insn ATTRIBUTE_UNUSED;
1834 {
1835   /* Currently nothing to do.  */
1836 }
1837
1838 static void
1839 hash_scan_call (x, insn)
1840      rtx x ATTRIBUTE_UNUSED, insn ATTRIBUTE_UNUSED;
1841 {
1842   /* Currently nothing to do.  */
1843 }
1844
1845 /* Process INSN and add hash table entries as appropriate.
1846
1847    Only available expressions that set a single pseudo-reg are recorded.
1848
1849    Single sets in a PARALLEL could be handled, but it's an extra complication
1850    that isn't dealt with right now.  The trick is handling the CLOBBERs that
1851    are also in the PARALLEL.  Later.
1852
1853    If SET_P is non-zero, this is for the assignment hash table,
1854    otherwise it is for the expression hash table.
1855    If IN_LIBCALL_BLOCK nonzero, we are in a libcall block, and should
1856    not record any expressions.  */
1857
1858 static void
1859 hash_scan_insn (insn, set_p, in_libcall_block)
1860      rtx insn;
1861      int set_p;
1862      int in_libcall_block;
1863 {
1864   rtx pat = PATTERN (insn);
1865
1866   /* Pick out the sets of INSN and for other forms of instructions record
1867      what's been modified.  */
1868
1869   if (GET_CODE (pat) == SET && ! in_libcall_block)
1870     hash_scan_set (pat, insn, set_p);
1871   else if (GET_CODE (pat) == PARALLEL)
1872     {
1873       int i;
1874
1875       for (i = 0; i < XVECLEN (pat, 0); i++)
1876         {
1877           rtx x = XVECEXP (pat, 0, i);
1878
1879           if (GET_CODE (x) == SET)
1880             {
1881               if (GET_CODE (SET_SRC (x)) == CALL)
1882                 hash_scan_call (SET_SRC (x), insn);
1883
1884               /* Check if first/last set in this block for classic
1885                  gcse, but not for constant/copy propagation.  */
1886               if (optimize_size && !set_p)
1887                 {
1888                   rtx dest = SET_DEST (x);
1889
1890                   while (GET_CODE (dest) == SUBREG
1891                          || GET_CODE (dest) == ZERO_EXTRACT
1892                          || GET_CODE (dest) == SIGN_EXTRACT
1893                          || GET_CODE (dest) == STRICT_LOW_PART)
1894                     dest = XEXP (dest, 0);
1895                   if (GET_CODE (dest) == REG)
1896                     maybe_set_rd_gen (REGNO (dest), insn);
1897                 }
1898             }
1899           else if (GET_CODE (x) == CLOBBER)
1900             hash_scan_clobber (x, insn);
1901           else if (GET_CODE (x) == CALL)
1902             hash_scan_call (x, insn);
1903         }
1904     }
1905   else if (GET_CODE (pat) == CLOBBER)
1906     hash_scan_clobber (pat, insn);
1907   else if (GET_CODE (pat) == CALL)
1908     hash_scan_call (pat, insn);
1909 }
1910
1911 static void
1912 dump_hash_table (file, name, table, table_size, total_size)
1913      FILE *file;
1914      char *name;
1915      struct expr **table;
1916      int table_size, total_size;
1917 {
1918   int i;
1919   /* Flattened out table, so it's printed in proper order.  */
1920   struct expr **flat_table = (struct expr **) alloca (total_size * sizeof (struct expr *));
1921   unsigned int *hash_val = (unsigned int *) alloca (total_size * sizeof (unsigned int));
1922
1923   bzero ((char *) flat_table, total_size * sizeof (struct expr *));
1924   for (i = 0; i < table_size; i++)
1925     {
1926       struct expr *expr;
1927
1928       for (expr = table[i]; expr != NULL; expr = expr->next_same_hash)
1929         {
1930           flat_table[expr->bitmap_index] = expr;
1931           hash_val[expr->bitmap_index] = i;
1932         }
1933     }
1934
1935   fprintf (file, "%s hash table (%d buckets, %d entries)\n",
1936            name, table_size, total_size);
1937
1938   for (i = 0; i < total_size; i++)
1939     {
1940       struct expr *expr = flat_table[i];
1941
1942       fprintf (file, "Index %d (hash value %d)\n  ",
1943                expr->bitmap_index, hash_val[i]);
1944       print_rtl (file, expr->expr);
1945       fprintf (file, "\n");
1946     }
1947
1948   fprintf (file, "\n");
1949 }
1950
1951 /* Record register first/last/block set information for REGNO in INSN.
1952    reg_first_set records the first place in the block where the register
1953    is set and is used to compute "anticipatability".
1954    reg_last_set records the last place in the block where the register
1955    is set and is used to compute "availability".
1956    reg_set_in_block records whether the register is set in the block
1957    and is used to compute "transparency".  */
1958
1959 static void
1960 record_last_reg_set_info (insn, regno)
1961      rtx insn;
1962      int regno;
1963 {
1964   if (reg_first_set[regno] == NEVER_SET)
1965     reg_first_set[regno] = INSN_CUID (insn);
1966   reg_last_set[regno] = INSN_CUID (insn);
1967   SET_BIT (reg_set_in_block[BLOCK_NUM (insn)], regno);
1968 }
1969
1970 /* Record memory first/last/block set information for INSN.  */
1971
1972 static void
1973 record_last_mem_set_info (insn)
1974      rtx insn;
1975 {
1976   if (mem_first_set == NEVER_SET)
1977     mem_first_set = INSN_CUID (insn);
1978   mem_last_set = INSN_CUID (insn);
1979   mem_set_in_block[BLOCK_NUM (insn)] = 1;
1980 }
1981
1982 /* Used for communicating between next two routines.  */
1983 static rtx last_set_insn;
1984
1985 /* Called from compute_hash_table via note_stores to handle one
1986    SET or CLOBBER in an insn.  */
1987
1988 static void
1989 record_last_set_info (dest, setter)
1990      rtx dest, setter ATTRIBUTE_UNUSED;
1991 {
1992   if (GET_CODE (dest) == SUBREG)
1993     dest = SUBREG_REG (dest);
1994
1995   if (GET_CODE (dest) == REG)
1996     record_last_reg_set_info (last_set_insn, REGNO (dest));
1997   else if (GET_CODE (dest) == MEM
1998            /* Ignore pushes, they clobber nothing.  */
1999            && ! push_operand (dest, GET_MODE (dest)))
2000     record_last_mem_set_info (last_set_insn);
2001 }
2002
2003 /* Top level function to create an expression or assignment hash table.
2004
2005    Expression entries are placed in the hash table if
2006    - they are of the form (set (pseudo-reg) src),
2007    - src is something we want to perform GCSE on,
2008    - none of the operands are subsequently modified in the block
2009
2010    Assignment entries are placed in the hash table if
2011    - they are of the form (set (pseudo-reg) src),
2012    - src is something we want to perform const/copy propagation on,
2013    - none of the operands or target are subsequently modified in the block
2014    Currently src must be a pseudo-reg or a const_int.
2015
2016    F is the first insn.
2017    SET_P is non-zero for computing the assignment hash table.  */
2018
2019 static void
2020 compute_hash_table (f, set_p)
2021      rtx f ATTRIBUTE_UNUSED;
2022      int set_p;
2023 {
2024   int bb;
2025
2026   /* While we compute the hash table we also compute a bit array of which
2027      registers are set in which blocks.
2028      We also compute which blocks set memory, in the absence of aliasing
2029      support [which is TODO].
2030      ??? This isn't needed during const/copy propagation, but it's cheap to
2031      compute.  Later.  */
2032   sbitmap_vector_zero (reg_set_in_block, n_basic_blocks);
2033   bzero ((char *) mem_set_in_block, n_basic_blocks);
2034
2035   /* Some working arrays used to track first and last set in each block.  */
2036   /* ??? One could use alloca here, but at some size a threshold is crossed
2037      beyond which one should use malloc.  Are we at that threshold here?  */
2038   reg_first_set = (int *) gmalloc (max_gcse_regno * sizeof (int));
2039   reg_last_set = (int *) gmalloc (max_gcse_regno * sizeof (int));
2040
2041   for (bb = 0; bb < n_basic_blocks; bb++)
2042     {
2043       rtx insn;
2044       int regno;
2045       int in_libcall_block;
2046       int i;
2047
2048       /* First pass over the instructions records information used to
2049          determine when registers and memory are first and last set.
2050          ??? The mem_set_in_block and hard-reg reg_set_in_block computation
2051          could be moved to compute_sets since they currently don't change.  */
2052
2053       for (i = 0; i < max_gcse_regno; i++)
2054         reg_first_set[i] = reg_last_set[i] = NEVER_SET;
2055       mem_first_set = NEVER_SET;
2056       mem_last_set = NEVER_SET;
2057
2058       for (insn = basic_block_head[bb];
2059            insn && insn != NEXT_INSN (basic_block_end[bb]);
2060            insn = NEXT_INSN (insn))
2061         {
2062 #ifdef NON_SAVING_SETJMP 
2063           if (NON_SAVING_SETJMP && GET_CODE (insn) == NOTE
2064               && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP)
2065             {
2066               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
2067                 record_last_reg_set_info (insn, regno);
2068               continue;
2069             }
2070 #endif
2071
2072           if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
2073             continue;
2074
2075           if (GET_CODE (insn) == CALL_INSN)
2076             {
2077               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
2078                 if ((call_used_regs[regno]
2079                      && regno != STACK_POINTER_REGNUM
2080 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
2081                      && regno != HARD_FRAME_POINTER_REGNUM
2082 #endif
2083 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
2084                      && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
2085 #endif
2086 #if defined (PIC_OFFSET_TABLE_REGNUM) && !defined (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED)
2087                      && ! (regno == PIC_OFFSET_TABLE_REGNUM && flag_pic)
2088 #endif
2089
2090                      && regno != FRAME_POINTER_REGNUM)
2091                     || global_regs[regno])
2092                   record_last_reg_set_info (insn, regno);
2093               if (! CONST_CALL_P (insn))
2094                 record_last_mem_set_info (insn);
2095             }
2096
2097           last_set_insn = insn;
2098           note_stores (PATTERN (insn), record_last_set_info);
2099         }
2100
2101       /* The next pass builds the hash table.  */
2102
2103       for (insn = basic_block_head[bb], in_libcall_block = 0;
2104            insn && insn != NEXT_INSN (basic_block_end[bb]);
2105            insn = NEXT_INSN (insn))
2106         {
2107           if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
2108             {
2109               if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
2110                 in_libcall_block = 1;
2111               else if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
2112                 in_libcall_block = 0;
2113               hash_scan_insn (insn, set_p, in_libcall_block);
2114             }
2115         }
2116     }
2117
2118   free (reg_first_set);
2119   free (reg_last_set);
2120   /* Catch bugs early.  */
2121   reg_first_set = reg_last_set = 0;
2122 }
2123
2124 /* Allocate space for the set hash table.
2125    N_INSNS is the number of instructions in the function.
2126    It is used to determine the number of buckets to use.  */
2127
2128 static void
2129 alloc_set_hash_table (n_insns)
2130      int n_insns;
2131 {
2132   int n;
2133
2134   set_hash_table_size = n_insns / 4;
2135   if (set_hash_table_size < 11)
2136     set_hash_table_size = 11;
2137   /* Attempt to maintain efficient use of hash table.
2138      Making it an odd number is simplest for now.
2139      ??? Later take some measurements.  */
2140   set_hash_table_size |= 1;
2141   n = set_hash_table_size * sizeof (struct expr *);
2142   set_hash_table = (struct expr **) gmalloc (n);
2143 }
2144
2145 /* Free things allocated by alloc_set_hash_table.  */
2146
2147 static void
2148 free_set_hash_table ()
2149 {
2150   free (set_hash_table);
2151 }
2152
2153 /* Compute the hash table for doing copy/const propagation.  */
2154
2155 static void
2156 compute_set_hash_table (f)
2157      rtx f;
2158 {
2159   /* Initialize count of number of entries in hash table.  */
2160   n_sets = 0;
2161   bzero ((char *) set_hash_table, set_hash_table_size * sizeof (struct expr *));
2162
2163   compute_hash_table (f, 1);
2164 }
2165
2166 /* Allocate space for the expression hash table.
2167    N_INSNS is the number of instructions in the function.
2168    It is used to determine the number of buckets to use.  */
2169
2170 static void
2171 alloc_expr_hash_table (n_insns)
2172      int n_insns;
2173 {
2174   int n;
2175
2176   expr_hash_table_size = n_insns / 2;
2177   /* Make sure the amount is usable.  */
2178   if (expr_hash_table_size < 11)
2179     expr_hash_table_size = 11;
2180   /* Attempt to maintain efficient use of hash table.
2181      Making it an odd number is simplest for now.
2182      ??? Later take some measurements.  */
2183   expr_hash_table_size |= 1;
2184   n = expr_hash_table_size * sizeof (struct expr *);
2185   expr_hash_table = (struct expr **) gmalloc (n);
2186 }
2187
2188 /* Free things allocated by alloc_expr_hash_table.  */
2189
2190 static void
2191 free_expr_hash_table ()
2192 {
2193   free (expr_hash_table);
2194 }
2195
2196 /* Compute the hash table for doing GCSE.  */
2197
2198 static void
2199 compute_expr_hash_table (f)
2200      rtx f;
2201 {
2202   /* Initialize count of number of entries in hash table.  */
2203   n_exprs = 0;
2204   bzero ((char *) expr_hash_table, expr_hash_table_size * sizeof (struct expr *));
2205
2206   compute_hash_table (f, 0);
2207 }
2208 \f
2209 /* Expression tracking support.  */
2210
2211 /* Lookup pattern PAT in the expression table.
2212    The result is a pointer to the table entry, or NULL if not found.  */
2213
2214 static struct expr *
2215 lookup_expr (pat)
2216      rtx pat;
2217 {
2218   int do_not_record_p;
2219   unsigned int hash = hash_expr (pat, GET_MODE (pat), &do_not_record_p,
2220                                  expr_hash_table_size);
2221   struct expr *expr;
2222
2223   if (do_not_record_p)
2224     return NULL;
2225
2226   expr = expr_hash_table[hash];
2227
2228   while (expr && ! expr_equiv_p (expr->expr, pat))
2229     expr = expr->next_same_hash;
2230
2231   return expr;
2232 }
2233
2234 /* Lookup REGNO in the set table.
2235    If PAT is non-NULL look for the entry that matches it, otherwise return
2236    the first entry for REGNO.
2237    The result is a pointer to the table entry, or NULL if not found.  */
2238
2239 static struct expr *
2240 lookup_set (regno, pat)
2241      int regno;
2242      rtx pat;
2243 {
2244   unsigned int hash = hash_set (regno, set_hash_table_size);
2245   struct expr *expr;
2246
2247   expr = set_hash_table[hash];
2248
2249   if (pat)
2250     {
2251       while (expr && ! expr_equiv_p (expr->expr, pat))
2252         expr = expr->next_same_hash;
2253     }
2254   else
2255     {
2256       while (expr && REGNO (SET_DEST (expr->expr)) != regno)
2257         expr = expr->next_same_hash;
2258     }
2259
2260   return expr;
2261 }
2262
2263 /* Return the next entry for REGNO in list EXPR.  */
2264
2265 static struct expr *
2266 next_set (regno, expr)
2267      int regno;
2268      struct expr *expr;
2269 {
2270   do
2271     expr = expr->next_same_hash;
2272   while (expr && REGNO (SET_DEST (expr->expr)) != regno);
2273   return expr;
2274 }
2275
2276 /* Reset tables used to keep track of what's still available [since the
2277    start of the block].  */
2278
2279 static void
2280 reset_opr_set_tables ()
2281 {
2282   /* Maintain a bitmap of which regs have been set since beginning of
2283      the block.  */
2284   sbitmap_zero (reg_set_bitmap);
2285   /* Also keep a record of the last instruction to modify memory.
2286      For now this is very trivial, we only record whether any memory
2287      location has been modified.  */
2288   mem_last_set = 0;
2289 }
2290
2291 /* Return non-zero if the operands of X are not set before INSN in
2292    INSN's basic block.  */
2293
2294 static int
2295 oprs_not_set_p (x, insn)
2296      rtx x, insn;
2297 {
2298   int i;
2299   enum rtx_code code;
2300   char *fmt;
2301
2302   /* repeat is used to turn tail-recursion into iteration.  */
2303 repeat:
2304
2305   if (x == 0)
2306     return 1;
2307
2308   code = GET_CODE (x);
2309   switch (code)
2310     {
2311     case PC:
2312     case CC0:
2313     case CONST:
2314     case CONST_INT:
2315     case CONST_DOUBLE:
2316     case SYMBOL_REF:
2317     case LABEL_REF:
2318     case ADDR_VEC:
2319     case ADDR_DIFF_VEC:
2320       return 1;
2321
2322     case MEM:
2323       if (mem_last_set != 0)
2324         return 0;
2325       x = XEXP (x, 0);
2326       goto repeat;
2327
2328     case REG:
2329       return ! TEST_BIT (reg_set_bitmap, REGNO (x));
2330
2331     default:
2332       break;
2333     }
2334
2335   fmt = GET_RTX_FORMAT (code);
2336   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2337     {
2338       if (fmt[i] == 'e')
2339         {
2340           int not_set_p;
2341           /* If we are about to do the last recursive call
2342              needed at this level, change it into iteration.
2343              This function is called enough to be worth it.  */
2344           if (i == 0)
2345             {
2346               x = XEXP (x, 0);
2347               goto repeat;
2348             }
2349           not_set_p = oprs_not_set_p (XEXP (x, i), insn);
2350           if (! not_set_p)
2351             return 0;
2352         }
2353       else if (fmt[i] == 'E')
2354         {
2355           int j;
2356           for (j = 0; j < XVECLEN (x, i); j++)
2357             {
2358               int not_set_p = oprs_not_set_p (XVECEXP (x, i, j), insn);
2359               if (! not_set_p)
2360                 return 0;
2361             }
2362         }
2363     }
2364
2365   return 1;
2366 }
2367
2368 /* Mark things set by a CALL.  */
2369
2370 static void
2371 mark_call (pat, insn)
2372      rtx pat ATTRIBUTE_UNUSED, insn;
2373 {
2374   mem_last_set = INSN_CUID (insn);
2375 }
2376
2377 /* Mark things set by a SET.  */
2378
2379 static void
2380 mark_set (pat, insn)
2381      rtx pat, insn;
2382 {
2383   rtx dest = SET_DEST (pat);
2384
2385   while (GET_CODE (dest) == SUBREG
2386          || GET_CODE (dest) == ZERO_EXTRACT
2387          || GET_CODE (dest) == SIGN_EXTRACT
2388          || GET_CODE (dest) == STRICT_LOW_PART)
2389     dest = XEXP (dest, 0);
2390
2391   if (GET_CODE (dest) == REG)
2392     SET_BIT (reg_set_bitmap, REGNO (dest));
2393   else if (GET_CODE (dest) == MEM)
2394     mem_last_set = INSN_CUID (insn);
2395
2396   if (GET_CODE (SET_SRC (pat)) == CALL)
2397     mark_call (SET_SRC (pat), insn);
2398 }
2399
2400 /* Record things set by a CLOBBER.  */
2401
2402 static void
2403 mark_clobber (pat, insn)
2404      rtx pat, insn;
2405 {
2406   rtx clob = XEXP (pat, 0);
2407
2408   while (GET_CODE (clob) == SUBREG || GET_CODE (clob) == STRICT_LOW_PART)
2409     clob = XEXP (clob, 0);
2410
2411   if (GET_CODE (clob) == REG)
2412     SET_BIT (reg_set_bitmap, REGNO (clob));
2413   else
2414     mem_last_set = INSN_CUID (insn);
2415 }
2416
2417 /* Record things set by INSN.
2418    This data is used by oprs_not_set_p.  */
2419
2420 static void
2421 mark_oprs_set (insn)
2422      rtx insn;
2423 {
2424   rtx pat = PATTERN (insn);
2425
2426   if (GET_CODE (pat) == SET)
2427     mark_set (pat, insn);
2428   else if (GET_CODE (pat) == PARALLEL)
2429     {
2430       int i;
2431
2432       for (i = 0; i < XVECLEN (pat, 0); i++)
2433         {
2434           rtx x = XVECEXP (pat, 0, i);
2435
2436           if (GET_CODE (x) == SET)
2437             mark_set (x, insn);
2438           else if (GET_CODE (x) == CLOBBER)
2439             mark_clobber (x, insn);
2440           else if (GET_CODE (x) == CALL)
2441             mark_call (x, insn);
2442         }
2443     }
2444   else if (GET_CODE (pat) == CLOBBER)
2445     mark_clobber (pat, insn);
2446   else if (GET_CODE (pat) == CALL)
2447     mark_call (pat, insn);
2448 }
2449 \f
2450 /* Classic GCSE reaching definition support.  */
2451
2452 /* Allocate reaching def variables.  */
2453
2454 static void
2455 alloc_rd_mem (n_blocks, n_insns)
2456      int n_blocks, n_insns;
2457 {
2458   rd_kill = (sbitmap *) sbitmap_vector_alloc (n_blocks, n_insns);
2459   sbitmap_vector_zero (rd_kill, n_basic_blocks);
2460
2461   rd_gen = (sbitmap *) sbitmap_vector_alloc (n_blocks, n_insns);
2462   sbitmap_vector_zero (rd_gen, n_basic_blocks);
2463
2464   reaching_defs = (sbitmap *) sbitmap_vector_alloc (n_blocks, n_insns);
2465   sbitmap_vector_zero (reaching_defs, n_basic_blocks);
2466
2467   rd_out = (sbitmap *) sbitmap_vector_alloc (n_blocks, n_insns);
2468   sbitmap_vector_zero (rd_out, n_basic_blocks);
2469 }
2470
2471 /* Free reaching def variables.  */
2472
2473 static void
2474 free_rd_mem ()
2475 {
2476   free (rd_kill);
2477   free (rd_gen);
2478   free (reaching_defs);
2479   free (rd_out);
2480 }
2481
2482 /* Add INSN to the kills of BB.
2483    REGNO, set in BB, is killed by INSN.  */
2484
2485 static void
2486 handle_rd_kill_set (insn, regno, bb)
2487      rtx insn;
2488      int regno, bb;
2489 {
2490   struct reg_set *this_reg = reg_set_table[regno];
2491
2492   while (this_reg)
2493     {
2494       if (BLOCK_NUM (this_reg->insn) != BLOCK_NUM (insn))
2495         SET_BIT (rd_kill[bb], INSN_CUID (this_reg->insn));
2496       this_reg = this_reg->next;
2497     }
2498 }
2499
2500 void
2501 dump_rd_table (file, title, bmap)
2502      FILE *file;
2503      char *title;
2504      sbitmap *bmap;
2505 {
2506   int bb,cuid,i,j,n;
2507
2508   fprintf (file, "%s\n", title);
2509   for (bb = 0; bb < n_basic_blocks; bb++)
2510     {
2511       fprintf (file, "BB %d\n", bb);
2512       dump_sbitmap (file, bmap[bb]);
2513       for (i = n = cuid = 0; i < bmap[bb]->size; i++)
2514         {
2515           for (j = 0; j < SBITMAP_ELT_BITS; j++, cuid++)
2516             {
2517               if ((bmap[bb]->elms[i] & (1 << j)) != 0)
2518                 {
2519                   if (n % 10 == 0)
2520                     fprintf (file, " ");
2521                   fprintf (file, " %d", INSN_UID (CUID_INSN (cuid)));
2522                   n++;
2523                 }
2524             }
2525         }
2526       if (n != 0)
2527         fprintf (file, "\n");
2528     }
2529   fprintf (file, "\n");
2530 }
2531
2532 /* Compute the set of kill's for reaching definitions.  */
2533
2534 static void
2535 compute_kill_rd ()
2536 {
2537   int bb,cuid;
2538
2539   /* For each block
2540        For each set bit in `gen' of the block (i.e each insn which
2541            generates a definition in the block)
2542          Call the reg set by the insn corresponding to that bit regx
2543          Look at the linked list starting at reg_set_table[regx]
2544          For each setting of regx in the linked list, which is not in
2545              this block
2546            Set the bit in `kill' corresponding to that insn
2547     */
2548
2549   for (bb = 0; bb < n_basic_blocks; bb++)
2550     {
2551       for (cuid = 0; cuid < max_cuid; cuid++)
2552         {
2553           if (TEST_BIT (rd_gen[bb], cuid))
2554             {
2555               rtx insn = CUID_INSN (cuid);
2556               rtx pat = PATTERN (insn);
2557
2558               if (GET_CODE (insn) == CALL_INSN)
2559                 {
2560                   int regno;
2561
2562                   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
2563                     {
2564                       if ((call_used_regs[regno]
2565                            && regno != STACK_POINTER_REGNUM
2566 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
2567                            && regno != HARD_FRAME_POINTER_REGNUM
2568 #endif
2569 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
2570                            && ! (regno == ARG_POINTER_REGNUM
2571                                  && fixed_regs[regno])
2572 #endif
2573 #if defined (PIC_OFFSET_TABLE_REGNUM) && !defined (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED)
2574                            && ! (regno == PIC_OFFSET_TABLE_REGNUM && flag_pic)
2575 #endif
2576                            && regno != FRAME_POINTER_REGNUM)
2577                           || global_regs[regno])
2578                         handle_rd_kill_set (insn, regno, bb);
2579                     }
2580                 }
2581
2582               if (GET_CODE (pat) == PARALLEL)
2583                 {
2584                   int i;
2585
2586                   /* We work backwards because ... */
2587                   for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
2588                     {
2589                       enum rtx_code code = GET_CODE (XVECEXP (pat, 0, i));
2590                       if ((code == SET || code == CLOBBER)
2591                           && GET_CODE (XEXP (XVECEXP (pat, 0, i), 0)) == REG)
2592                         handle_rd_kill_set (insn,
2593                                             REGNO (XEXP (XVECEXP (pat, 0, i), 0)),
2594                                             bb);
2595                     }
2596                 }
2597               else if (GET_CODE (pat) == SET)
2598                 {
2599                   if (GET_CODE (SET_DEST (pat)) == REG)
2600                     {
2601                       /* Each setting of this register outside of this block
2602                          must be marked in the set of kills in this block.  */
2603                       handle_rd_kill_set (insn, REGNO (SET_DEST (pat)), bb);
2604                     }
2605                 }
2606               /* FIXME: CLOBBER? */
2607             }
2608         }
2609     }
2610 }
2611
2612 /* Compute the reaching definitions as in 
2613    Compilers Principles, Techniques, and Tools. Aho, Sethi, Ullman,
2614    Chapter 10.  It is the same algorithm as used for computing available
2615    expressions but applied to the gens and kills of reaching definitions.  */
2616
2617 static void
2618 compute_rd ()
2619 {
2620   int bb, changed, passes;
2621
2622   for (bb = 0; bb < n_basic_blocks; bb++)
2623     sbitmap_copy (rd_out[bb] /*dst*/, rd_gen[bb] /*src*/);
2624
2625   passes = 0;
2626   changed = 1;
2627   while (changed)
2628     {
2629       changed = 0;
2630       for (bb = 0; bb < n_basic_blocks; bb++)
2631         {
2632           sbitmap_union_of_predecessors (reaching_defs[bb], rd_out,
2633                                          bb, s_preds);
2634           changed |= sbitmap_union_of_diff (rd_out[bb], rd_gen[bb],
2635                                             reaching_defs[bb], rd_kill[bb]);
2636         }
2637       passes++;
2638     }
2639
2640   if (gcse_file)
2641     fprintf (gcse_file, "reaching def computation: %d passes\n", passes);
2642 }
2643 \f
2644 /* Classic GCSE available expression support.  */
2645
2646 /* Allocate memory for available expression computation.  */
2647
2648 static void
2649 alloc_avail_expr_mem (n_blocks, n_exprs)
2650      int n_blocks, n_exprs;
2651 {
2652   ae_kill = (sbitmap *) sbitmap_vector_alloc (n_blocks, n_exprs);
2653   sbitmap_vector_zero (ae_kill, n_basic_blocks);
2654
2655   ae_gen = (sbitmap *) sbitmap_vector_alloc (n_blocks, n_exprs);
2656   sbitmap_vector_zero (ae_gen, n_basic_blocks);
2657
2658   ae_in = (sbitmap *) sbitmap_vector_alloc (n_blocks, n_exprs);
2659   sbitmap_vector_zero (ae_in, n_basic_blocks);
2660
2661   ae_out = (sbitmap *) sbitmap_vector_alloc (n_blocks, n_exprs);
2662   sbitmap_vector_zero (ae_out, n_basic_blocks);
2663
2664   u_bitmap = (sbitmap) sbitmap_alloc (n_exprs);
2665   sbitmap_ones (u_bitmap);
2666 }
2667
2668 static void
2669 free_avail_expr_mem ()
2670 {
2671   free (ae_kill);
2672   free (ae_gen);
2673   free (ae_in);
2674   free (ae_out);
2675   free (u_bitmap);
2676 }
2677
2678 /* Compute the set of available expressions generated in each basic block.  */
2679
2680 static void
2681 compute_ae_gen ()
2682 {
2683   int i;
2684
2685   /* For each recorded occurrence of each expression, set ae_gen[bb][expr].
2686      This is all we have to do because an expression is not recorded if it
2687      is not available, and the only expressions we want to work with are the
2688      ones that are recorded.  */
2689
2690   for (i = 0; i < expr_hash_table_size; i++)
2691     {
2692       struct expr *expr = expr_hash_table[i];
2693       while (expr != NULL)
2694         {
2695           struct occr *occr = expr->avail_occr;
2696           while (occr != NULL)
2697             {
2698               SET_BIT (ae_gen[BLOCK_NUM (occr->insn)], expr->bitmap_index);
2699               occr = occr->next;
2700             }
2701           expr = expr->next_same_hash;
2702         }
2703     }
2704 }
2705
2706 /* Return non-zero if expression X is killed in BB.  */
2707
2708 static int
2709 expr_killed_p (x, bb)
2710      rtx x;
2711      int bb;
2712 {
2713   int i;
2714   enum rtx_code code;
2715   char *fmt;
2716
2717   /* repeat is used to turn tail-recursion into iteration.  */
2718  repeat:
2719
2720   if (x == 0)
2721     return 1;
2722
2723   code = GET_CODE (x);
2724   switch (code)
2725     {
2726     case REG:
2727       return TEST_BIT (reg_set_in_block[bb], REGNO (x));
2728
2729     case MEM:
2730       if (mem_set_in_block[bb])
2731         return 1;
2732       x = XEXP (x, 0);
2733       goto repeat;
2734
2735     case PC:
2736     case CC0: /*FIXME*/
2737     case CONST:
2738     case CONST_INT:
2739     case CONST_DOUBLE:
2740     case SYMBOL_REF:
2741     case LABEL_REF:
2742     case ADDR_VEC:
2743     case ADDR_DIFF_VEC:
2744       return 0;
2745
2746     default:
2747       break;
2748     }
2749
2750   i = GET_RTX_LENGTH (code) - 1;
2751   fmt = GET_RTX_FORMAT (code);
2752   for (; i >= 0; i--)
2753     {
2754       if (fmt[i] == 'e')
2755         {
2756           rtx tem = XEXP (x, i);
2757
2758           /* If we are about to do the last recursive call
2759              needed at this level, change it into iteration.
2760              This function is called enough to be worth it.  */
2761           if (i == 0)
2762             {
2763               x = tem;
2764               goto repeat;
2765             }
2766           if (expr_killed_p (tem, bb))
2767             return 1;
2768         }
2769       else if (fmt[i] == 'E')
2770         {
2771           int j;
2772           for (j = 0; j < XVECLEN (x, i); j++)
2773             {
2774               if (expr_killed_p (XVECEXP (x, i, j), bb))
2775                 return 1;
2776             }
2777         }
2778     }
2779
2780   return 0;
2781 }
2782
2783 /* Compute the set of available expressions killed in each basic block.  */
2784
2785 static void
2786 compute_ae_kill ()
2787 {
2788   int bb,i;
2789
2790   for (bb = 0; bb < n_basic_blocks; bb++)
2791     {
2792       for (i = 0; i < expr_hash_table_size; i++)
2793         {
2794           struct expr *expr = expr_hash_table[i];
2795
2796           for ( ; expr != NULL; expr = expr->next_same_hash)
2797             {
2798               /* Skip EXPR if generated in this block.  */
2799               if (TEST_BIT (ae_gen[bb], expr->bitmap_index))
2800                 continue;
2801
2802               if (expr_killed_p (expr->expr, bb))
2803                 SET_BIT (ae_kill[bb], expr->bitmap_index);
2804             }
2805         }
2806     }
2807 }
2808
2809 /* Compute available expressions.
2810
2811    Implement the algorithm to find available expressions
2812    as given in the Aho Sethi Ullman book, pages 627-631.  */
2813
2814 static void
2815 compute_available ()
2816 {
2817   int bb, changed, passes;
2818
2819   sbitmap_zero (ae_in[0]);
2820
2821   sbitmap_copy (ae_out[0] /*dst*/, ae_gen[0] /*src*/);
2822
2823   for (bb = 1; bb < n_basic_blocks; bb++)
2824     sbitmap_difference (ae_out[bb], u_bitmap, ae_kill[bb]);
2825     
2826   passes = 0;
2827   changed = 1;
2828   while (changed)
2829     {
2830       changed = 0;
2831       for (bb = 1; bb < n_basic_blocks; bb++)
2832         {
2833           sbitmap_intersect_of_predecessors (ae_in[bb], ae_out,
2834                                              bb, s_preds);
2835           changed |= sbitmap_union_of_diff (ae_out[bb], ae_gen[bb],
2836                                             ae_in[bb], ae_kill[bb]);
2837         }
2838       passes++;
2839     }
2840
2841   if (gcse_file)
2842     fprintf (gcse_file, "avail expr computation: %d passes\n", passes);
2843 }
2844 \f
2845 /* Actually perform the Classic GCSE optimizations.  */
2846
2847 /* Return non-zero if occurrence OCCR of expression EXPR reaches block BB.
2848
2849    CHECK_SELF_LOOP is non-zero if we should consider a block reaching itself
2850    as a positive reach.  We want to do this when there are two computations
2851    of the expression in the block.
2852
2853    VISITED is a pointer to a working buffer for tracking which BB's have
2854    been visited.  It is NULL for the top-level call.
2855
2856    We treat reaching expressions that go through blocks containing the same
2857    reaching expression as "not reaching".  E.g. if EXPR is generated in blocks
2858    2 and 3, INSN is in block 4, and 2->3->4, we treat the expression in block
2859    2 as not reaching.  The intent is to improve the probability of finding
2860    only one reaching expression and to reduce register lifetimes by picking
2861    the closest such expression.  */
2862
2863 static int
2864 expr_reaches_here_p (occr, expr, bb, check_self_loop, visited)
2865      struct occr *occr;
2866      struct expr *expr;
2867      int bb;
2868      int check_self_loop;
2869      char *visited;
2870 {
2871   int_list_ptr pred;
2872
2873   if (visited == NULL)
2874     {
2875       visited = (char *) alloca (n_basic_blocks);
2876       bzero (visited, n_basic_blocks);
2877     }
2878
2879   for (pred = s_preds[bb]; pred != NULL; pred = pred->next)
2880     {
2881       int pred_bb = INT_LIST_VAL (pred);
2882
2883       if (visited[pred_bb])
2884         {
2885           /* This predecessor has already been visited.
2886              Nothing to do.  */
2887           ;
2888         }
2889       else if (pred_bb == bb)
2890         {
2891           /* BB loops on itself.  */
2892           if (check_self_loop
2893               && TEST_BIT (ae_gen[pred_bb], expr->bitmap_index)
2894               && BLOCK_NUM (occr->insn) == pred_bb)
2895             return 1;
2896           visited[pred_bb] = 1;
2897         }
2898       /* Ignore this predecessor if it kills the expression.  */
2899       else if (TEST_BIT (ae_kill[pred_bb], expr->bitmap_index))
2900         visited[pred_bb] = 1;
2901       /* Does this predecessor generate this expression?  */
2902       else if (TEST_BIT (ae_gen[pred_bb], expr->bitmap_index))
2903         {
2904           /* Is this the occurrence we're looking for?
2905              Note that there's only one generating occurrence per block
2906              so we just need to check the block number.  */
2907           if (BLOCK_NUM (occr->insn) == pred_bb)
2908             return 1;
2909           visited[pred_bb] = 1;
2910         }
2911       /* Neither gen nor kill.  */
2912       else
2913         {
2914           visited[pred_bb] = 1;
2915           if (expr_reaches_here_p (occr, expr, pred_bb, check_self_loop, visited))
2916             return 1;
2917         }
2918     }
2919
2920   /* All paths have been checked.  */
2921   return 0;
2922 }
2923
2924 /* Return the instruction that computes EXPR that reaches INSN's basic block.
2925    If there is more than one such instruction, return NULL.
2926
2927    Called only by handle_avail_expr.  */
2928
2929 static rtx
2930 computing_insn (expr, insn)
2931      struct expr *expr;
2932      rtx insn;
2933 {
2934   int bb = BLOCK_NUM (insn);
2935
2936   if (expr->avail_occr->next == NULL)
2937     {    
2938       if (BLOCK_NUM (expr->avail_occr->insn) == bb)
2939         {
2940           /* The available expression is actually itself
2941              (i.e. a loop in the flow graph) so do nothing.  */
2942           return NULL;
2943         }
2944       /* (FIXME) Case that we found a pattern that was created by
2945          a substitution that took place.  */
2946       return expr->avail_occr->insn;
2947     }
2948   else
2949     {
2950       /* Pattern is computed more than once.
2951          Search backwards from this insn to see how many of these 
2952          computations actually reach this insn.  */
2953       struct occr *occr;
2954       rtx insn_computes_expr = NULL;
2955       int can_reach = 0;
2956
2957       for (occr = expr->avail_occr; occr != NULL; occr = occr->next)
2958         {
2959           if (BLOCK_NUM (occr->insn) == bb)
2960             {
2961               /* The expression is generated in this block.
2962                  The only time we care about this is when the expression
2963                  is generated later in the block [and thus there's a loop].
2964                  We let the normal cse pass handle the other cases.  */
2965               if (INSN_CUID (insn) < INSN_CUID (occr->insn))
2966                 {
2967                   if (expr_reaches_here_p (occr, expr, bb, 1, NULL))
2968                     {
2969                       can_reach++;
2970                       if (can_reach > 1)
2971                         return NULL;
2972                       insn_computes_expr = occr->insn;
2973                     }
2974                 }
2975             }
2976           else /* Computation of the pattern outside this block.  */
2977             {
2978               if (expr_reaches_here_p (occr, expr, bb, 0, NULL))
2979                 {
2980                   can_reach++;
2981                   if (can_reach > 1)
2982                     return NULL;
2983                   insn_computes_expr = occr->insn;
2984                 }
2985             }
2986         }
2987
2988       if (insn_computes_expr == NULL)
2989         abort ();
2990       return insn_computes_expr;
2991     }
2992 }
2993
2994 /* Return non-zero if the definition in DEF_INSN can reach INSN.
2995    Only called by can_disregard_other_sets.  */
2996
2997 static int
2998 def_reaches_here_p (insn, def_insn)
2999      rtx insn, def_insn;
3000 {
3001   rtx reg;
3002
3003   if (TEST_BIT (reaching_defs[BLOCK_NUM (insn)], INSN_CUID (def_insn)))
3004     return 1;
3005
3006   if (BLOCK_NUM (insn) == BLOCK_NUM (def_insn))
3007     {
3008       if (INSN_CUID (def_insn) < INSN_CUID (insn))
3009         {
3010           if (GET_CODE (PATTERN (def_insn)) == PARALLEL)
3011             return 1;
3012           if (GET_CODE (PATTERN (def_insn)) == CLOBBER)
3013             reg = XEXP (PATTERN (def_insn), 0);
3014           else if (GET_CODE (PATTERN (def_insn)) == SET)
3015             reg = SET_DEST (PATTERN (def_insn));
3016           else
3017             abort ();
3018           return ! reg_set_between_p (reg, NEXT_INSN (def_insn), insn);
3019         }
3020       else
3021         return 0;
3022     }
3023
3024   return 0;
3025 }
3026
3027 /* Return non-zero if *ADDR_THIS_REG can only have one value at INSN.
3028    The value returned is the number of definitions that reach INSN.
3029    Returning a value of zero means that [maybe] more than one definition
3030    reaches INSN and the caller can't perform whatever optimization it is
3031    trying.  i.e. it is always safe to return zero.  */
3032
3033 static int
3034 can_disregard_other_sets (addr_this_reg, insn, for_combine)
3035      struct reg_set **addr_this_reg;
3036      rtx insn;
3037      int for_combine;
3038 {
3039   int number_of_reaching_defs = 0;
3040   struct reg_set *this_reg = *addr_this_reg;
3041
3042   while (this_reg)
3043     {
3044       if (def_reaches_here_p (insn, this_reg->insn))
3045         {
3046           number_of_reaching_defs++;
3047           /* Ignore parallels for now.  */
3048           if (GET_CODE (PATTERN (this_reg->insn)) == PARALLEL)
3049             return 0;
3050           if (!for_combine
3051               && (GET_CODE (PATTERN (this_reg->insn)) == CLOBBER
3052                   || ! rtx_equal_p (SET_SRC (PATTERN (this_reg->insn)),
3053                                     SET_SRC (PATTERN (insn)))))
3054             {
3055               /* A setting of the reg to a different value reaches INSN.  */
3056               return 0;
3057             }
3058           if (number_of_reaching_defs > 1)
3059             {
3060               /* If in this setting the value the register is being
3061                  set to is equal to the previous value the register 
3062                  was set to and this setting reaches the insn we are
3063                  trying to do the substitution on then we are ok.  */
3064
3065               if (GET_CODE (PATTERN (this_reg->insn)) == CLOBBER)
3066                 return 0;
3067               if (! rtx_equal_p (SET_SRC (PATTERN (this_reg->insn)),
3068                                  SET_SRC (PATTERN (insn))))
3069                 return 0;
3070             }
3071           *addr_this_reg = this_reg; 
3072         }
3073
3074       /* prev_this_reg = this_reg; */
3075       this_reg = this_reg->next;
3076     }
3077
3078   return number_of_reaching_defs;
3079 }
3080
3081 /* Expression computed by insn is available and the substitution is legal,
3082    so try to perform the substitution.
3083
3084    The result is non-zero if any changes were made.  */
3085
3086 static int
3087 handle_avail_expr (insn, expr)
3088      rtx insn;
3089      struct expr *expr;
3090 {
3091   rtx pat, insn_computes_expr;
3092   rtx to;
3093   struct reg_set *this_reg;
3094   int found_setting, use_src;
3095   int changed = 0;
3096
3097   /* We only handle the case where one computation of the expression
3098      reaches this instruction.  */
3099   insn_computes_expr = computing_insn (expr, insn);
3100   if (insn_computes_expr == NULL)
3101     return 0;
3102
3103   found_setting = 0;
3104   use_src = 0;
3105
3106   /* At this point we know only one computation of EXPR outside of this
3107      block reaches this insn.  Now try to find a register that the
3108      expression is computed into.  */
3109
3110   if (GET_CODE (SET_SRC (PATTERN (insn_computes_expr))) == REG)
3111     {
3112       /* This is the case when the available expression that reaches
3113          here has already been handled as an available expression.  */
3114       int regnum_for_replacing = REGNO (SET_SRC (PATTERN (insn_computes_expr)));
3115       /* If the register was created by GCSE we can't use `reg_set_table',
3116          however we know it's set only once.  */
3117       if (regnum_for_replacing >= max_gcse_regno
3118           /* If the register the expression is computed into is set only once,
3119              or only one set reaches this insn, we can use it.  */
3120           || (((this_reg = reg_set_table[regnum_for_replacing]),
3121                this_reg->next == NULL)
3122               || can_disregard_other_sets (&this_reg, insn, 0)))
3123        {
3124          use_src = 1;
3125          found_setting = 1;
3126        }
3127     }
3128
3129   if (!found_setting)
3130     {
3131       int regnum_for_replacing = REGNO (SET_DEST (PATTERN (insn_computes_expr)));
3132       /* This shouldn't happen.  */
3133       if (regnum_for_replacing >= max_gcse_regno)
3134         abort ();
3135       this_reg = reg_set_table[regnum_for_replacing];
3136       /* If the register the expression is computed into is set only once,
3137          or only one set reaches this insn, use it.  */
3138       if (this_reg->next == NULL
3139           || can_disregard_other_sets (&this_reg, insn, 0))
3140         found_setting = 1;
3141     }
3142
3143   if (found_setting)
3144     {
3145       pat = PATTERN (insn);
3146       if (use_src)
3147         to = SET_SRC (PATTERN (insn_computes_expr));
3148       else
3149         to = SET_DEST (PATTERN (insn_computes_expr));
3150       changed = validate_change (insn, &SET_SRC (pat), to, 0);
3151
3152       /* We should be able to ignore the return code from validate_change but
3153          to play it safe we check.  */
3154       if (changed)
3155         {
3156           gcse_subst_count++;
3157           if (gcse_file != NULL)
3158             {
3159               fprintf (gcse_file, "GCSE: Replacing the source in insn %d with reg %d %s insn %d\n",
3160                        INSN_UID (insn), REGNO (to),
3161                        use_src ? "from" : "set in",
3162                        INSN_UID (insn_computes_expr));
3163             }
3164
3165         }
3166     }
3167   /* The register that the expr is computed into is set more than once.  */
3168   else if (1 /*expensive_op(this_pattrn->op) && do_expensive_gcse)*/)
3169     {
3170       /* Insert an insn after insnx that copies the reg set in insnx
3171          into a new pseudo register call this new register REGN.
3172          From insnb until end of basic block or until REGB is set
3173          replace all uses of REGB with REGN.  */
3174       rtx new_insn;
3175
3176       to = gen_reg_rtx (GET_MODE (SET_DEST (PATTERN (insn_computes_expr))));
3177
3178       /* Generate the new insn.  */
3179       /* ??? If the change fails, we return 0, even though we created
3180          an insn.  I think this is ok.  */
3181       new_insn
3182         = emit_insn_after (gen_rtx_SET (VOIDmode, to,
3183                                         SET_DEST (PATTERN (insn_computes_expr))),
3184                                   insn_computes_expr);
3185       /* Keep block number table up to date.  */
3186       set_block_num (new_insn, BLOCK_NUM (insn_computes_expr));
3187       /* Keep register set table up to date.  */
3188       record_one_set (REGNO (to), new_insn);
3189
3190       gcse_create_count++;
3191       if (gcse_file != NULL)
3192         {
3193           fprintf (gcse_file, "GCSE: Creating insn %d to copy value of reg %d, computed in insn %d,\n",
3194                    INSN_UID (NEXT_INSN (insn_computes_expr)),
3195                    REGNO (SET_SRC (PATTERN (NEXT_INSN (insn_computes_expr)))),
3196                    INSN_UID (insn_computes_expr));
3197           fprintf (gcse_file, "      into newly allocated reg %d\n", REGNO (to));
3198         }
3199
3200       pat = PATTERN (insn);
3201
3202       /* Do register replacement for INSN.  */
3203       changed = validate_change (insn, &SET_SRC (pat),
3204                                  SET_DEST (PATTERN (NEXT_INSN (insn_computes_expr))),
3205                                  0);
3206
3207       /* We should be able to ignore the return code from validate_change but
3208          to play it safe we check.  */
3209       if (changed)
3210         {
3211           gcse_subst_count++;
3212           if (gcse_file != NULL)
3213             {
3214               fprintf (gcse_file, "GCSE: Replacing the source in insn %d with reg %d set in insn %d\n",
3215                        INSN_UID (insn),
3216                        REGNO (SET_DEST (PATTERN (NEXT_INSN (insn_computes_expr)))),
3217                        INSN_UID (insn_computes_expr)); 
3218             }
3219
3220         }
3221     }
3222
3223   return changed;
3224 }
3225
3226 /* Perform classic GCSE.
3227    This is called by one_classic_gcse_pass after all the dataflow analysis
3228    has been done.
3229
3230    The result is non-zero if a change was made.  */
3231
3232 static int
3233 classic_gcse ()
3234 {
3235   int bb, changed;
3236   rtx insn;
3237
3238   /* Note we start at block 1.  */
3239
3240   changed = 0;
3241   for (bb = 1; bb < n_basic_blocks; bb++)
3242     {
3243       /* Reset tables used to keep track of what's still valid [since the
3244          start of the block].  */
3245       reset_opr_set_tables ();
3246
3247       for (insn = basic_block_head[bb];
3248            insn != NULL && insn != NEXT_INSN (basic_block_end[bb]);
3249            insn = NEXT_INSN (insn))
3250         {
3251           /* Is insn of form (set (pseudo-reg) ...)?  */
3252
3253           if (GET_CODE (insn) == INSN
3254               && GET_CODE (PATTERN (insn)) == SET
3255               && GET_CODE (SET_DEST (PATTERN (insn))) == REG
3256               && REGNO (SET_DEST (PATTERN (insn))) >= FIRST_PSEUDO_REGISTER)
3257             {
3258               rtx pat = PATTERN (insn);
3259               rtx src = SET_SRC (pat);
3260               struct expr *expr;
3261
3262               if (want_to_gcse_p (src)
3263                   /* Is the expression recorded?  */
3264                   && ((expr = lookup_expr (src)) != NULL)
3265                   /* Is the expression available [at the start of the
3266                      block]?  */
3267                   && TEST_BIT (ae_in[bb], expr->bitmap_index)
3268                   /* Are the operands unchanged since the start of the
3269                      block?  */
3270                   && oprs_not_set_p (src, insn))
3271                 changed |= handle_avail_expr (insn, expr);
3272             }
3273
3274           /* Keep track of everything modified by this insn.  */
3275           /* ??? Need to be careful w.r.t. mods done to INSN.  */
3276           if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
3277             mark_oprs_set (insn);
3278         }
3279     }
3280
3281   return changed;
3282 }
3283
3284 /* Top level routine to perform one classic GCSE pass.
3285
3286    Return non-zero if a change was made.  */
3287
3288 static int
3289 one_classic_gcse_pass (f, pass)
3290      rtx f;
3291      int pass;
3292 {
3293   int changed = 0;
3294
3295   gcse_subst_count = 0;
3296   gcse_create_count = 0;
3297
3298   alloc_expr_hash_table (max_cuid);
3299   alloc_rd_mem (n_basic_blocks, max_cuid);
3300   compute_expr_hash_table (f);
3301   if (gcse_file)
3302     dump_hash_table (gcse_file, "Expression", expr_hash_table,
3303                      expr_hash_table_size, n_exprs);
3304   if (n_exprs > 0)
3305     {
3306       compute_kill_rd ();
3307       compute_rd ();
3308       alloc_avail_expr_mem (n_basic_blocks, n_exprs);
3309       compute_ae_gen ();
3310       compute_ae_kill ();
3311       compute_available ();
3312       changed = classic_gcse ();
3313       free_avail_expr_mem ();
3314     }
3315   free_rd_mem ();
3316   free_expr_hash_table ();
3317
3318   if (gcse_file)
3319     {
3320       fprintf (gcse_file, "\n");
3321       fprintf (gcse_file, "GCSE of %s, pass %d: %d bytes needed, %d substs, %d insns created\n",
3322                current_function_name, pass,
3323                bytes_used, gcse_subst_count, gcse_create_count);
3324     }
3325
3326   return changed;
3327 }
3328 \f
3329 /* Compute copy/constant propagation working variables.  */
3330
3331 /* Local properties of assignments.  */
3332
3333 static sbitmap *cprop_pavloc;
3334 static sbitmap *cprop_absaltered;
3335
3336 /* Global properties of assignments (computed from the local properties).  */
3337
3338 static sbitmap *cprop_avin;
3339 static sbitmap *cprop_avout;
3340
3341 /* Allocate vars used for copy/const propagation.
3342    N_BLOCKS is the number of basic blocks.
3343    N_SETS is the number of sets.  */
3344
3345 static void
3346 alloc_cprop_mem (n_blocks, n_sets)
3347      int n_blocks, n_sets;
3348 {
3349   cprop_pavloc = sbitmap_vector_alloc (n_blocks, n_sets);
3350   cprop_absaltered = sbitmap_vector_alloc (n_blocks, n_sets);
3351
3352   cprop_avin = sbitmap_vector_alloc (n_blocks, n_sets);
3353   cprop_avout = sbitmap_vector_alloc (n_blocks, n_sets);
3354 }
3355
3356 /* Free vars used by copy/const propagation.  */
3357
3358 static void
3359 free_cprop_mem ()
3360 {
3361   free (cprop_pavloc);
3362   free (cprop_absaltered);
3363   free (cprop_avin);
3364   free (cprop_avout);
3365 }
3366
3367 /* Dump copy/const propagation data.  */
3368
3369 void
3370 dump_cprop_data (file)
3371      FILE *file;
3372 {
3373   dump_sbitmap_vector (file, "CPROP partially locally available sets", "BB",
3374                        cprop_pavloc, n_basic_blocks);
3375   dump_sbitmap_vector (file, "CPROP absolutely altered sets", "BB",
3376                        cprop_absaltered, n_basic_blocks);
3377
3378   dump_sbitmap_vector (file, "CPROP available incoming sets", "BB",
3379                        cprop_avin, n_basic_blocks);
3380   dump_sbitmap_vector (file, "CPROP available outgoing sets", "BB",
3381                        cprop_avout, n_basic_blocks);
3382 }
3383
3384 /* For each block, compute whether X is transparent.
3385    X is either an expression or an assignment [though we don't care which,
3386    for this context an assignment is treated as an expression].
3387    For each block where an element of X is modified, set (SET_P == 1) or reset
3388    (SET_P == 0) the INDX bit in BMAP.  */
3389
3390 static void
3391 compute_transp (x, indx, bmap, set_p)
3392      rtx x;
3393      int indx;
3394      sbitmap *bmap;
3395      int set_p;
3396 {
3397   int bb,i;
3398   enum rtx_code code;
3399   char *fmt;
3400
3401   /* repeat is used to turn tail-recursion into iteration.  */
3402  repeat:
3403
3404   if (x == 0)
3405     return;
3406
3407   code = GET_CODE (x);
3408   switch (code)
3409     {
3410     case REG:
3411       {
3412         reg_set *r;
3413         int regno = REGNO (x);
3414
3415         if (set_p)
3416           {
3417             if (regno < FIRST_PSEUDO_REGISTER)
3418               {
3419                 for (bb = 0; bb < n_basic_blocks; bb++)
3420                   if (TEST_BIT (reg_set_in_block[bb], regno))
3421                     SET_BIT (bmap[bb], indx);
3422               }
3423             else
3424               {
3425                 for (r = reg_set_table[regno]; r != NULL; r = r->next)
3426                   {
3427                     bb = BLOCK_NUM (r->insn);
3428                     SET_BIT (bmap[bb], indx);
3429                   }
3430               }
3431           }
3432         else
3433           {
3434             if (regno < FIRST_PSEUDO_REGISTER)
3435               {
3436                 for (bb = 0; bb < n_basic_blocks; bb++)
3437                   if (TEST_BIT (reg_set_in_block[bb], regno))
3438                     RESET_BIT (bmap[bb], indx);
3439               }
3440             else
3441               {
3442                 for (r = reg_set_table[regno]; r != NULL; r = r->next)
3443                   {
3444                     bb = BLOCK_NUM (r->insn);
3445                     RESET_BIT (bmap[bb], indx);
3446                   }
3447               }
3448           }
3449         return;
3450       }
3451
3452     case MEM:
3453       if (set_p)
3454         {
3455           for (bb = 0; bb < n_basic_blocks; bb++)
3456             if (mem_set_in_block[bb])
3457               SET_BIT (bmap[bb], indx);
3458         }
3459       else
3460         {
3461           for (bb = 0; bb < n_basic_blocks; bb++)
3462             if (mem_set_in_block[bb])
3463               RESET_BIT (bmap[bb], indx);
3464         }
3465       x = XEXP (x, 0);
3466       goto repeat;
3467
3468     case PC:
3469     case CC0: /*FIXME*/
3470     case CONST:
3471     case CONST_INT:
3472     case CONST_DOUBLE:
3473     case SYMBOL_REF:
3474     case LABEL_REF:
3475     case ADDR_VEC:
3476     case ADDR_DIFF_VEC:
3477       return;
3478
3479     default:
3480       break;
3481     }
3482
3483   i = GET_RTX_LENGTH (code) - 1;
3484   fmt = GET_RTX_FORMAT (code);
3485   for (; i >= 0; i--)
3486     {
3487       if (fmt[i] == 'e')
3488         {
3489           rtx tem = XEXP (x, i);
3490
3491           /* If we are about to do the last recursive call
3492              needed at this level, change it into iteration.
3493              This function is called enough to be worth it.  */
3494           if (i == 0)
3495             {
3496               x = tem;
3497               goto repeat;
3498             }
3499           compute_transp (tem, indx, bmap, set_p);
3500         }
3501       else if (fmt[i] == 'E')
3502         {
3503           int j;
3504           for (j = 0; j < XVECLEN (x, i); j++)
3505             compute_transp (XVECEXP (x, i, j), indx, bmap, set_p);
3506         }
3507     }
3508 }
3509
3510 static void
3511 compute_cprop_local_properties ()
3512 {
3513   int i;
3514
3515   sbitmap_vector_zero (cprop_absaltered, n_basic_blocks);
3516   sbitmap_vector_zero (cprop_pavloc, n_basic_blocks);
3517
3518   for (i = 0; i < set_hash_table_size; i++)
3519     {
3520       struct expr *expr;
3521
3522       for (expr = set_hash_table[i]; expr != NULL; expr = expr->next_same_hash)
3523         {
3524           struct occr *occr;
3525           int indx = expr->bitmap_index;
3526
3527           /* The assignment is absolutely altered if any operand is modified
3528              by this block [excluding the assignment itself].
3529              We start by assuming all are transparent [none are killed], and
3530              then setting the bits for those that are.  */
3531
3532           compute_transp (expr->expr, indx, cprop_absaltered, 1);
3533
3534           /* The occurrences recorded in avail_occr are exactly those that
3535              we want to set to non-zero in PAVLOC.  */
3536
3537           for (occr = expr->avail_occr; occr != NULL; occr = occr->next)
3538             {
3539               int bb = BLOCK_NUM (occr->insn);
3540               SET_BIT (cprop_pavloc[bb], indx);
3541             }
3542         }
3543     }
3544 }
3545
3546 static void
3547 compute_cprop_avinout ()
3548 {
3549   int bb, changed, passes;
3550
3551   sbitmap_zero (cprop_avin[0]);
3552   sbitmap_vector_ones (cprop_avout, n_basic_blocks);
3553
3554   passes = 0;
3555   changed = 1;
3556   while (changed)
3557     {
3558       changed = 0;
3559       for (bb = 0; bb < n_basic_blocks; bb++)
3560         {
3561           if (bb != 0)
3562             sbitmap_intersect_of_predecessors (cprop_avin[bb], cprop_avout,
3563                                                bb, s_preds);
3564           changed |= sbitmap_union_of_diff (cprop_avout[bb],
3565                                             cprop_pavloc[bb],
3566                                             cprop_avin[bb],
3567                                             cprop_absaltered[bb]);
3568         }
3569       passes++;
3570     }
3571
3572   if (gcse_file)
3573     fprintf (gcse_file, "cprop avail expr computation: %d passes\n", passes);
3574 }
3575
3576 /* Top level routine to do the dataflow analysis needed by copy/const
3577    propagation.  */
3578
3579 static void
3580 compute_cprop_data ()
3581 {
3582   compute_cprop_local_properties ();
3583   compute_cprop_avinout ();
3584 }
3585 \f
3586 /* Copy/constant propagation.  */
3587
3588 struct reg_use {
3589   rtx reg_rtx;
3590 };
3591
3592 /* Maximum number of register uses in an insn that we handle.  */
3593 #define MAX_USES 8
3594
3595 /* Table of uses found in an insn.
3596    Allocated statically to avoid alloc/free complexity and overhead.  */
3597 static struct reg_use reg_use_table[MAX_USES];
3598
3599 /* Index into `reg_use_table' while building it.  */
3600 static int reg_use_count;
3601
3602 /* Set up a list of register numbers used in INSN.
3603    The found uses are stored in `reg_use_table'.
3604    `reg_use_count' is initialized to zero before entry, and
3605    contains the number of uses in the table upon exit.
3606
3607    ??? If a register appears multiple times we will record it multiple
3608    times.  This doesn't hurt anything but it will slow things down.  */
3609
3610 static void
3611 find_used_regs (x)
3612      rtx x;
3613 {
3614   int i;
3615   enum rtx_code code;
3616   char *fmt;
3617
3618   /* repeat is used to turn tail-recursion into iteration.  */
3619  repeat:
3620
3621   if (x == 0)
3622     return;
3623
3624   code = GET_CODE (x);
3625   switch (code)
3626     {
3627     case REG:
3628       if (reg_use_count == MAX_USES)
3629         return;
3630       reg_use_table[reg_use_count].reg_rtx = x;
3631       reg_use_count++;
3632       return;
3633
3634     case MEM:
3635       x = XEXP (x, 0);
3636       goto repeat;
3637
3638     case PC:
3639     case CC0:
3640     case CONST:
3641     case CONST_INT:
3642     case CONST_DOUBLE:
3643     case SYMBOL_REF:
3644     case LABEL_REF:
3645     case CLOBBER:
3646     case ADDR_VEC:
3647     case ADDR_DIFF_VEC:
3648     case ASM_INPUT: /*FIXME*/
3649       return;
3650
3651     case SET:
3652       if (GET_CODE (SET_DEST (x)) == MEM)
3653         find_used_regs (SET_DEST (x));
3654       x = SET_SRC (x);
3655       goto repeat;
3656
3657     default:
3658       break;
3659     }
3660
3661   /* Recursively scan the operands of this expression.  */
3662
3663   fmt = GET_RTX_FORMAT (code);
3664   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3665     {
3666       if (fmt[i] == 'e')
3667         {
3668           /* If we are about to do the last recursive call
3669              needed at this level, change it into iteration.
3670              This function is called enough to be worth it.  */
3671           if (i == 0)
3672             {
3673               x = XEXP (x, 0);
3674               goto repeat;
3675             }
3676           find_used_regs (XEXP (x, i));
3677         }
3678       else if (fmt[i] == 'E')
3679         {
3680           int j;
3681           for (j = 0; j < XVECLEN (x, i); j++)
3682             find_used_regs (XVECEXP (x, i, j));
3683         }
3684     }
3685 }
3686
3687 /* Try to replace all non-SET_DEST occurrences of FROM in INSN with TO.
3688    Returns non-zero is successful.  */
3689
3690 static int
3691 try_replace_reg (from, to, insn)
3692      rtx from, to, insn;
3693 {
3694   return validate_replace_src (from, to, insn);
3695 }
3696
3697 /* Find a set of REGNO that is available on entry to INSN's block.
3698    Returns NULL if not found.  */
3699
3700 static struct expr *
3701 find_avail_set (regno, insn)
3702      int regno;
3703      rtx insn;
3704 {
3705   struct expr *set = lookup_set (regno, NULL_RTX);
3706
3707   while (set)
3708     {
3709       if (TEST_BIT (cprop_avin[BLOCK_NUM (insn)], set->bitmap_index))
3710         break;
3711       set = next_set (regno, set);
3712     }
3713
3714   return set;
3715 }
3716
3717 /* Perform constant and copy propagation on INSN.
3718    The result is non-zero if a change was made.  */
3719
3720 static int
3721 cprop_insn (insn)
3722      rtx insn;
3723 {
3724   struct reg_use *reg_used;
3725   int changed = 0;
3726
3727   /* ??? For now only propagate into SETs.  */
3728   if (GET_CODE (insn) != INSN
3729       || GET_CODE (PATTERN (insn)) != SET)
3730     return 0;
3731
3732   reg_use_count = 0;
3733   find_used_regs (PATTERN (insn));
3734
3735   reg_used = &reg_use_table[0];
3736   for ( ; reg_use_count > 0; reg_used++, reg_use_count--)
3737     {
3738       rtx pat, src;
3739       struct expr *set;
3740       int regno = REGNO (reg_used->reg_rtx);
3741
3742       /* Ignore registers created by GCSE.
3743          We do this because ... */
3744       if (regno >= max_gcse_regno)
3745         continue;
3746
3747       /* If the register has already been set in this block, there's
3748          nothing we can do.  */
3749       if (! oprs_not_set_p (reg_used->reg_rtx, insn))
3750         continue;
3751
3752       /* Find an assignment that sets reg_used and is available
3753          at the start of the block.  */
3754       set = find_avail_set (regno, insn);
3755       if (! set)
3756         continue;
3757   
3758       pat = set->expr;
3759       /* ??? We might be able to handle PARALLELs.  Later.  */
3760       if (GET_CODE (pat) != SET)
3761         abort ();
3762       src = SET_SRC (pat);
3763
3764       if (GET_CODE (src) == CONST_INT)
3765         {
3766           if (try_replace_reg (reg_used->reg_rtx, src, insn))
3767             {
3768               changed = 1;
3769               const_prop_count++;
3770               if (gcse_file != NULL)
3771                 {
3772                   fprintf (gcse_file, "CONST-PROP: Replacing reg %d in insn %d with constant ",
3773                            regno, INSN_UID (insn));
3774                   fprintf (gcse_file, HOST_WIDE_INT_PRINT_DEC, INTVAL (src));
3775                   fprintf (gcse_file, "\n");
3776                 }
3777
3778               /* The original insn setting reg_used may or may not now be
3779                  deletable.  We leave the deletion to flow.  */
3780             }
3781         }
3782       else if (GET_CODE (src) == REG
3783                && REGNO (src) >= FIRST_PSEUDO_REGISTER
3784                && REGNO (src) != regno)
3785         {
3786           /* We know the set is available.
3787              Now check that SET_SRC is ANTLOC (i.e. none of the source operands
3788              have changed since the start of the block).  */
3789           if (oprs_not_set_p (src, insn))
3790             {
3791               if (try_replace_reg (reg_used->reg_rtx, src, insn))
3792                 {
3793                   changed = 1;
3794                   copy_prop_count++;
3795                   if (gcse_file != NULL)
3796                     {
3797                       fprintf (gcse_file, "COPY-PROP: Replacing reg %d in insn %d with reg %d\n",
3798                                regno, INSN_UID (insn), REGNO (src));
3799                     }
3800
3801                   /* The original insn setting reg_used may or may not now be
3802                      deletable.  We leave the deletion to flow.  */
3803                   /* FIXME: If it turns out that the insn isn't deletable,
3804                      then we may have unnecessarily extended register lifetimes
3805                      and made things worse.  */
3806                 }
3807             }
3808         }
3809     }
3810
3811   return changed;
3812 }
3813
3814 /* Forward propagate copies.
3815    This includes copies and constants.
3816    Return non-zero if a change was made.  */
3817
3818 static int
3819 cprop ()
3820 {
3821   int bb, changed;
3822   rtx insn;
3823
3824   /* Note we start at block 1.  */
3825
3826   changed = 0;
3827   for (bb = 1; bb < n_basic_blocks; bb++)
3828     {
3829       /* Reset tables used to keep track of what's still valid [since the
3830          start of the block].  */
3831       reset_opr_set_tables ();
3832
3833       for (insn = basic_block_head[bb];
3834            insn != NULL && insn != NEXT_INSN (basic_block_end[bb]);
3835            insn = NEXT_INSN (insn))
3836         {
3837           if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
3838             {
3839               changed |= cprop_insn (insn);
3840
3841               /* Keep track of everything modified by this insn.  */
3842               /* ??? Need to be careful w.r.t. mods done to INSN.  */
3843               mark_oprs_set (insn);
3844             }
3845         }
3846     }
3847
3848   if (gcse_file != NULL)
3849     fprintf (gcse_file, "\n");
3850
3851   return changed;
3852 }
3853
3854 /* Perform one copy/constant propagation pass.
3855    F is the first insn in the function.
3856    PASS is the pass count.  */
3857
3858 static int
3859 one_cprop_pass (f, pass)
3860      rtx f;
3861      int pass;
3862 {
3863   int changed = 0;
3864
3865   const_prop_count = 0;
3866   copy_prop_count = 0;
3867
3868   alloc_set_hash_table (max_cuid);
3869   compute_set_hash_table (f);
3870   if (gcse_file)
3871     dump_hash_table (gcse_file, "SET", set_hash_table, set_hash_table_size,
3872                      n_sets);
3873   if (n_sets > 0)
3874     {
3875       alloc_cprop_mem (n_basic_blocks, n_sets);
3876       compute_cprop_data ();
3877       changed = cprop ();
3878       free_cprop_mem ();
3879     }
3880   free_set_hash_table ();
3881
3882   if (gcse_file)
3883     {
3884       fprintf (gcse_file, "CPROP of %s, pass %d: %d bytes needed, %d const props, %d copy props\n",
3885                current_function_name, pass,
3886                bytes_used, const_prop_count, copy_prop_count);
3887       fprintf (gcse_file, "\n");
3888     }
3889
3890   return changed;
3891 }
3892 \f
3893 /* Compute PRE working variables.  */
3894
3895 /* Local properties of expressions.  */
3896 /* Nonzero for expressions that are transparent in the block.  */
3897 static sbitmap *pre_transp;
3898 /* Nonzero for expressions that are computed (available) in the block.  */
3899 static sbitmap *pre_comp;
3900 /* Nonzero for expressions that are locally anticipatable in the block.  */
3901 static sbitmap *pre_antloc;
3902
3903 /* Global properties (computed from the expression local properties).  */
3904 /* Nonzero for expressions that are available on block entry/exit.  */
3905 static sbitmap *pre_avin;
3906 static sbitmap *pre_avout;
3907 /* Nonzero for expressions that are anticipatable on block entry/exit.  */
3908 static sbitmap *pre_antin;
3909 static sbitmap *pre_antout;
3910 /* Nonzero for expressions that are partially available on block entry/exit.  */
3911 static sbitmap *pre_pavin;
3912 static sbitmap *pre_pavout;
3913 /* Nonzero for expressions that are "placement possible" on block entry/exit.  */
3914 static sbitmap *pre_ppin;
3915 static sbitmap *pre_ppout;
3916
3917 /* Nonzero for expressions that are transparent at the end of the block.
3918    This is only zero for expressions killed by abnormal critical edge
3919    created by a calls.  */
3920 static sbitmap *pre_transpout;
3921
3922 /* Used while performing PRE to denote which insns are redundant.  */
3923 static sbitmap pre_redundant;
3924
3925 /* Allocate vars used for PRE analysis.  */
3926
3927 static void
3928 alloc_pre_mem (n_blocks, n_exprs)
3929      int n_blocks, n_exprs;
3930 {
3931   pre_transp = sbitmap_vector_alloc (n_blocks, n_exprs);
3932   pre_comp = sbitmap_vector_alloc (n_blocks, n_exprs);
3933   pre_antloc = sbitmap_vector_alloc (n_blocks, n_exprs);
3934
3935   pre_avin = sbitmap_vector_alloc (n_blocks, n_exprs);
3936   pre_avout = sbitmap_vector_alloc (n_blocks, n_exprs);
3937   pre_antin = sbitmap_vector_alloc (n_blocks, n_exprs);
3938   pre_antout = sbitmap_vector_alloc (n_blocks, n_exprs);
3939
3940   pre_pavin = sbitmap_vector_alloc (n_blocks, n_exprs);
3941   pre_pavout = sbitmap_vector_alloc (n_blocks, n_exprs);
3942   pre_ppin = sbitmap_vector_alloc (n_blocks, n_exprs);
3943   pre_ppout = sbitmap_vector_alloc (n_blocks, n_exprs);
3944
3945   pre_transpout = sbitmap_vector_alloc (n_blocks, n_exprs);
3946 }
3947
3948 /* Free vars used for PRE analysis.  */
3949
3950 static void
3951 free_pre_mem ()
3952 {
3953   free (pre_transp);
3954   free (pre_comp);
3955   free (pre_antloc);
3956   free (pre_avin);
3957   free (pre_avout);
3958   free (pre_antin);
3959   free (pre_antout);
3960
3961   free (pre_pavin);
3962   free (pre_pavout);
3963   free (pre_ppin);
3964   free (pre_ppout);
3965   free (pre_transpout);
3966 }
3967
3968 /* Dump PRE data.  */
3969
3970 void
3971 dump_pre_data (file)
3972      FILE *file;
3973 {
3974   dump_sbitmap_vector (file, "PRE locally transparent expressions", "BB",
3975                        pre_transp, n_basic_blocks);
3976   dump_sbitmap_vector (file, "PRE locally available expressions", "BB",
3977                        pre_comp, n_basic_blocks);
3978   dump_sbitmap_vector (file, "PRE locally anticipatable expressions", "BB",
3979                        pre_antloc, n_basic_blocks);
3980
3981   dump_sbitmap_vector (file, "PRE available incoming expressions", "BB",
3982                        pre_avin, n_basic_blocks);
3983   dump_sbitmap_vector (file, "PRE available outgoing expressions", "BB",
3984                        pre_avout, n_basic_blocks);
3985   dump_sbitmap_vector (file, "PRE anticipatable incoming expressions", "BB",
3986                        pre_antin, n_basic_blocks);
3987   dump_sbitmap_vector (file, "PRE anticipatable outgoing expressions", "BB",
3988                        pre_antout, n_basic_blocks);
3989
3990   dump_sbitmap_vector (file, "PRE partially available incoming expressions", "BB",
3991                        pre_pavin, n_basic_blocks);
3992   dump_sbitmap_vector (file, "PRE partially available outgoing expressions", "BB",
3993                        pre_pavout, n_basic_blocks);
3994   dump_sbitmap_vector (file, "PRE placement possible on incoming", "BB",
3995                        pre_ppin, n_basic_blocks);
3996   dump_sbitmap_vector (file, "PRE placement possible on outgoing", "BB",
3997                        pre_ppout, n_basic_blocks);
3998
3999   dump_sbitmap_vector (file, "PRE transparent on outgoing", "BB",
4000                        pre_transpout, n_basic_blocks);
4001 }
4002
4003 /* Compute the local properties of each recorded expression.
4004    Local properties are those that are defined by the block, irrespective
4005    of other blocks.
4006
4007    An expression is transparent in a block if its operands are not modified
4008    in the block.
4009
4010    An expression is computed (locally available) in a block if it is computed
4011    at least once and expression would contain the same value if the
4012    computation was moved to the end of the block.
4013
4014    An expression is locally anticipatable in a block if it is computed at
4015    least once and expression would contain the same value if the computation
4016    was moved to the beginning of the block.  */
4017
4018 static void
4019 compute_pre_local_properties ()
4020 {
4021   int i;
4022
4023   sbitmap_vector_ones (pre_transp, n_basic_blocks);
4024   sbitmap_vector_zero (pre_comp, n_basic_blocks);
4025   sbitmap_vector_zero (pre_antloc, n_basic_blocks);
4026
4027   for (i = 0; i < expr_hash_table_size; i++)
4028     {
4029       struct expr *expr;
4030
4031       for (expr = expr_hash_table[i]; expr != NULL; expr = expr->next_same_hash)
4032         {
4033           struct occr *occr;
4034           int indx = expr->bitmap_index;
4035
4036           /* The expression is transparent in this block if it is not killed.
4037              We start by assuming all are transparent [none are killed], and then
4038              reset the bits for those that are.  */
4039
4040           compute_transp (expr->expr, indx, pre_transp, 0);
4041
4042           /* The occurrences recorded in antic_occr are exactly those that
4043              we want to set to non-zero in ANTLOC.  */
4044
4045           for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
4046             {
4047               int bb = BLOCK_NUM (occr->insn);
4048               SET_BIT (pre_antloc[bb], indx);
4049
4050               /* While we're scanning the table, this is a good place to
4051                  initialize this.  */
4052               occr->deleted_p = 0;
4053             }
4054
4055           /* The occurrences recorded in avail_occr are exactly those that
4056              we want to set to non-zero in COMP.  */
4057
4058           for (occr = expr->avail_occr; occr != NULL; occr = occr->next)
4059             {
4060               int bb = BLOCK_NUM (occr->insn);
4061               SET_BIT (pre_comp[bb], indx);
4062
4063               /* While we're scanning the table, this is a good place to
4064                  initialize this.  */
4065               occr->copied_p = 0;
4066             }
4067
4068           /* While we're scanning the table, this is a good place to
4069              initialize this.  */
4070           expr->reaching_reg = 0;
4071         }
4072     }
4073 }
4074
4075 /* Compute expression availability at entrance and exit of each block.  */
4076
4077 static void
4078 compute_pre_avinout ()
4079 {
4080   int bb, changed, passes;
4081
4082   sbitmap_zero (pre_avin[0]);
4083   sbitmap_vector_ones (pre_avout, n_basic_blocks);
4084
4085   passes = 0;
4086   changed = 1;
4087   while (changed)
4088     {
4089       changed = 0;
4090       for (bb = 0; bb < n_basic_blocks; bb++)
4091         {
4092           if (bb != 0)
4093             sbitmap_intersect_of_predecessors (pre_avin[bb], pre_avout,
4094                                                bb, s_preds);
4095           changed |= sbitmap_a_or_b_and_c (pre_avout[bb], pre_comp[bb],
4096                                            pre_transp[bb], pre_avin[bb]);
4097         }
4098       passes++;
4099     }
4100
4101   if (gcse_file)
4102     fprintf (gcse_file, "avail expr computation: %d passes\n", passes);
4103 }
4104
4105 /* Compute expression anticipatability at entrance and exit of each block.  */
4106
4107 static void
4108 compute_pre_antinout ()
4109 {
4110   int bb, changed, passes;
4111
4112   sbitmap_zero (pre_antout[n_basic_blocks - 1]);
4113   sbitmap_vector_ones (pre_antin, n_basic_blocks);
4114
4115   passes = 0;
4116   changed = 1;
4117   while (changed)
4118     {
4119       changed = 0;
4120       /* We scan the blocks in the reverse order to speed up
4121          the convergence.  */
4122       for (bb = n_basic_blocks - 1; bb >= 0; bb--)
4123         {
4124           if (bb != n_basic_blocks - 1)
4125             sbitmap_intersect_of_successors (pre_antout[bb], pre_antin,
4126                                              bb, s_succs);
4127           changed |= sbitmap_a_or_b_and_c (pre_antin[bb], pre_antloc[bb],
4128                                            pre_transp[bb], pre_antout[bb]);
4129         }
4130       passes++;
4131     }
4132
4133   if (gcse_file)
4134     fprintf (gcse_file, "antic expr computation: %d passes\n", passes);
4135 }
4136
4137 /* Compute expression partial availability at entrance and exit of
4138    each block.  */
4139
4140 static void
4141 compute_pre_pavinout ()
4142 {
4143   int bb, changed, passes;
4144
4145   sbitmap_zero (pre_pavin[0]);
4146   sbitmap_vector_zero (pre_pavout, n_basic_blocks);
4147
4148   passes = 0;
4149   changed = 1;
4150   while (changed)
4151     {
4152       changed = 0;
4153       for (bb = 0; bb < n_basic_blocks; bb++)
4154         {
4155           if (bb != 0)
4156             sbitmap_union_of_predecessors (pre_pavin[bb], pre_pavout,
4157                                            bb, s_preds);
4158           changed |= sbitmap_a_or_b_and_c (pre_pavout[bb], pre_comp[bb],
4159                                            pre_transp[bb], pre_pavin[bb]);
4160         }
4161       passes++;
4162     }
4163
4164   if (gcse_file)
4165     fprintf (gcse_file, "partially avail expr computation: %d passes\n", passes);
4166 }
4167
4168 /* Compute transparent outgoing information for each block.
4169
4170    An expression is transparent to an edge unless it is killed by
4171    the edge itself.  This can only happen with abnormal control flow,
4172    when the edge is traversed through a call.  This happens with
4173    non-local labels and exceptions.
4174
4175    This would not be necessary if we split the edge.  While this is
4176    normally impossible for abnormal critical edges, with some effort
4177    it should be possible with exception handling, since we still have
4178    control over which handler should be invoked.  But due to increased
4179    EH table sizes, this may not be worthwhile.  */
4180
4181 static void
4182 compute_pre_transpout ()
4183 {
4184   int bb;
4185
4186   sbitmap_vector_ones (pre_transpout, n_basic_blocks);
4187
4188   for (bb = 0; bb < n_basic_blocks; ++bb)
4189     {
4190       int i;
4191
4192       /* Note that flow inserted a nop a the end of basic blocks that
4193          end in call instructions for reasons other than abnormal
4194          control flow.  */
4195       if (GET_CODE (BLOCK_END (bb)) != CALL_INSN)
4196         continue;
4197
4198       for (i = 0; i < expr_hash_table_size; i++)
4199         {
4200           struct expr *expr;
4201           for (expr = expr_hash_table[i]; expr ; expr = expr->next_same_hash)
4202             if (GET_CODE (expr->expr) == MEM)
4203               {
4204                 rtx addr = XEXP (expr->expr, 0);
4205
4206                 if (GET_CODE (addr) == SYMBOL_REF
4207                     && CONSTANT_POOL_ADDRESS_P (addr))
4208                   continue;
4209                 
4210                 /* ??? Optimally, we would use interprocedural alias
4211                    analysis to determine if this mem is actually killed
4212                    by this call.  */
4213                 RESET_BIT (pre_transpout[bb], expr->bitmap_index);
4214               }
4215         }
4216     }
4217 }   
4218
4219 /* Compute "placement possible" information on entrance and exit of
4220    each block.
4221
4222    From Fred Chow's Thesis:
4223    A computation `e' is PP at a point `p' if it is anticipated at `p' and
4224    all the anticipated e's can be rendered redundant by zero or more
4225    insertions at that point and some other points in the procedure, and
4226    these insertions satisfy the conditions that the insertions are always
4227    at points that `e' is anticipated and the first anticipated e's after the
4228    insertions are rendered redundant.  */
4229
4230 static void
4231 compute_pre_ppinout ()
4232 {
4233   int bb, i, changed, size, passes;
4234
4235   sbitmap_vector_ones (pre_ppin, n_basic_blocks);
4236   /* ??? Inefficient as we set pre_ppin[0] twice, but simple.  */
4237   sbitmap_zero (pre_ppin[0]);
4238
4239   sbitmap_vector_ones (pre_ppout, n_basic_blocks);
4240   /* ??? Inefficient as we set pre_ppout[n_basic_blocks-1] twice, but simple.  */
4241   sbitmap_zero (pre_ppout[n_basic_blocks - 1]);
4242
4243   size = pre_ppin[0]->size;
4244   passes = 0;
4245   changed = 1;
4246   while (changed)
4247     {
4248       changed = 0;
4249       for (bb = 1; bb < n_basic_blocks; bb++)
4250         {
4251           sbitmap_ptr antin = pre_antin[bb]->elms;
4252           sbitmap_ptr pavin = pre_pavin[bb]->elms;
4253           sbitmap_ptr antloc = pre_antloc[bb]->elms;
4254           sbitmap_ptr transp = pre_transp[bb]->elms;
4255           sbitmap_ptr ppout = pre_ppout[bb]->elms;
4256           sbitmap_ptr ppin = pre_ppin[bb]->elms;
4257
4258           for (i = 0; i < size; i++)
4259             {
4260               int_list_ptr pred;
4261               SBITMAP_ELT_TYPE tmp = *antin & *pavin & (*antloc | (*transp & *ppout));
4262               SBITMAP_ELT_TYPE pred_val = -1L;
4263
4264               for (pred = s_preds[bb]; pred != NULL; pred = pred->next)
4265                 {
4266                   int pred_bb = INT_LIST_VAL (pred);
4267                   sbitmap_ptr ppout_j,avout_j;
4268
4269                   if (pred_bb == ENTRY_BLOCK)
4270                     continue;
4271
4272                   /* If this is a back edge, propagate info along the back
4273                      edge to allow for loop invariant code motion.
4274
4275                      See FOLLOW_BACK_EDGES at the top of this file for a longer
4276                      discussion about loop invariant code motion in pre.  */
4277                   if (! FOLLOW_BACK_EDGES
4278                       && (INSN_CUID (BLOCK_HEAD (bb))
4279                           < INSN_CUID (BLOCK_END (pred_bb))))
4280                     {
4281                       pred_val = 0;
4282                     }
4283                   else
4284                     {
4285                       ppout_j = pre_ppout[pred_bb]->elms + i;
4286                       avout_j = pre_avout[pred_bb]->elms + i;
4287                       pred_val &= *ppout_j | *avout_j;
4288                     }
4289                 }
4290               tmp &= pred_val;
4291               *ppin = tmp;
4292               antin++; pavin++; antloc++; transp++; ppout++; ppin++;
4293             }
4294         }
4295
4296       for (bb = 0; bb < n_basic_blocks - 1; bb++)
4297         {
4298           sbitmap_ptr ppout = pre_ppout[bb]->elms;
4299           sbitmap_ptr transpout = pre_transpout[bb]->elms;
4300
4301           for (i = 0; i < size; i++)
4302             {
4303               int_list_ptr succ;
4304               SBITMAP_ELT_TYPE tmp = *transpout;
4305
4306               for (succ = s_succs[bb]; succ != NULL; succ = succ->next)
4307                 {
4308                   int succ_bb = INT_LIST_VAL (succ);
4309                   sbitmap_ptr ppin;
4310
4311                   if (succ_bb == EXIT_BLOCK)
4312                     continue;
4313
4314                   ppin = pre_ppin[succ_bb]->elms + i;
4315                   tmp &= *ppin;
4316                 }
4317
4318               if (*ppout != tmp)
4319                 {
4320                   changed = 1;
4321                   *ppout = tmp;
4322                 }
4323
4324               ppout++; transpout++;
4325             }
4326         }
4327
4328       passes++;
4329     }
4330
4331   if (gcse_file)
4332     fprintf (gcse_file, "placement possible computation: %d passes\n", passes);
4333 }
4334
4335 /* Top level routine to do the dataflow analysis needed by PRE.  */
4336
4337 static void
4338 compute_pre_data ()
4339 {
4340   compute_pre_local_properties ();
4341   compute_pre_avinout ();
4342   compute_pre_antinout ();
4343   compute_pre_pavinout ();
4344   compute_pre_transpout ();
4345   compute_pre_ppinout ();
4346   if (gcse_file)
4347     fprintf (gcse_file, "\n");
4348 }
4349 \f
4350 /* PRE utilities */
4351
4352 /* Return non-zero if occurrence OCCR of expression EXPR reaches block BB.
4353
4354    VISITED is a pointer to a working buffer for tracking which BB's have
4355    been visited.  It is NULL for the top-level call.
4356
4357    We treat reaching expressions that go through blocks containing the same
4358    reaching expression as "not reaching".  E.g. if EXPR is generated in blocks
4359    2 and 3, INSN is in block 4, and 2->3->4, we treat the expression in block
4360    2 as not reaching.  The intent is to improve the probability of finding
4361    only one reaching expression and to reduce register lifetimes by picking
4362    the closest such expression.  */
4363
4364 static int
4365 pre_expr_reaches_here_p (occr, expr, bb, visited)
4366      struct occr *occr;
4367      struct expr *expr;
4368      int bb;
4369      char *visited;
4370 {
4371   int_list_ptr pred;
4372
4373   if (visited == NULL)
4374     {
4375       visited = (char *) alloca (n_basic_blocks);
4376       bzero (visited, n_basic_blocks);
4377     }
4378
4379   for (pred = s_preds[bb]; pred != NULL; pred = pred->next)
4380     {
4381       int pred_bb = INT_LIST_VAL (pred);
4382
4383       if (pred_bb == ENTRY_BLOCK
4384           /* Has predecessor has already been visited?  */
4385           || visited[pred_bb])
4386         {
4387           /* Nothing to do.  */
4388         }
4389       /* Does this predecessor generate this expression?  */
4390       else if (TEST_BIT (pre_comp[pred_bb], expr->bitmap_index))
4391         {
4392           /* Is this the occurrence we're looking for?
4393              Note that there's only one generating occurrence per block
4394              so we just need to check the block number.  */
4395           if (BLOCK_NUM (occr->insn) == pred_bb)
4396             return 1;
4397           visited[pred_bb] = 1;
4398         }
4399       /* Ignore this predecessor if it kills the expression.  */
4400       else if (! TEST_BIT (pre_transp[pred_bb], expr->bitmap_index))
4401         visited[pred_bb] = 1;
4402       /* Neither gen nor kill.  */
4403       else
4404         {
4405           visited[pred_bb] = 1;
4406           if (pre_expr_reaches_here_p (occr, expr, pred_bb, visited))
4407             return 1;
4408         }
4409     }
4410
4411   /* All paths have been checked.  */
4412   return 0;
4413 }
4414 \f
4415 /* Add EXPR to the end of basic block BB.  */
4416
4417 static void
4418 pre_insert_insn (expr, bb)
4419      struct expr *expr;
4420      int bb;
4421 {
4422   rtx insn = BLOCK_END (bb);
4423   rtx new_insn;
4424   rtx reg = expr->reaching_reg;
4425   int regno = REGNO (reg);
4426   rtx pat;
4427
4428   pat = gen_rtx_SET (VOIDmode, reg, copy_rtx (expr->expr));
4429
4430   /* If the last insn is a jump, insert EXPR in front [taking care to
4431      handle cc0, etc. properly].  */
4432
4433   if (GET_CODE (insn) == JUMP_INSN)
4434     {
4435 #ifdef HAVE_cc0
4436       rtx note;
4437 #endif
4438
4439       /* If this is a jump table, then we can't insert stuff here.  Since
4440          we know the previous real insn must be the tablejump, we insert
4441          the new instruction just before the tablejump.  */
4442       if (GET_CODE (PATTERN (insn)) == ADDR_VEC
4443           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
4444         insn = prev_real_insn (insn);
4445
4446 #ifdef HAVE_cc0
4447       /* FIXME: 'twould be nice to call prev_cc0_setter here but it aborts
4448          if cc0 isn't set.  */
4449       note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
4450       if (note)
4451         insn = XEXP (note, 0);
4452       else
4453         {
4454           rtx maybe_cc0_setter = prev_nonnote_insn (insn);
4455           if (maybe_cc0_setter
4456               && GET_RTX_CLASS (GET_CODE (maybe_cc0_setter)) == 'i'
4457               && sets_cc0_p (PATTERN (maybe_cc0_setter)))
4458             insn = maybe_cc0_setter;
4459         }
4460 #endif
4461       /* FIXME: What if something in cc0/jump uses value set in new insn?  */
4462       new_insn = emit_insn_before (pat, insn);
4463       add_label_notes (SET_SRC (pat), new_insn);
4464       if (BLOCK_HEAD (bb) == insn)
4465         BLOCK_HEAD (bb) = new_insn;
4466     }
4467   /* Likewise if the last insn is a call, as will happen in the presence
4468      of exception handling.  */
4469   else if (GET_CODE (insn) == CALL_INSN)
4470     {
4471       HARD_REG_SET parm_regs;
4472       int nparm_regs;
4473       rtx p;
4474
4475       /* Keeping in mind SMALL_REGISTER_CLASSES and parameters in registers,
4476          we search backward and place the instructions before the first
4477          parameter is loaded.  Do this for everyone for consistency and a
4478          presumtion that we'll get better code elsewhere as well.  */
4479
4480       /* It should always be the case that we can put these instructions
4481          anywhere in the basic block.  Check this.  */
4482       /* ??? Well, it would be the case if we'd split all critical edges.
4483          Since we didn't, we may very well abort.  */
4484       if (!TEST_BIT (pre_antloc[bb], expr->bitmap_index)
4485           && !TEST_BIT (pre_transp[bb], expr->bitmap_index))
4486         abort ();
4487
4488       /* Since different machines initialize their parameter registers
4489          in different orders, assume nothing.  Collect the set of all
4490          parameter registers.  */
4491       CLEAR_HARD_REG_SET (parm_regs);
4492       nparm_regs = 0;
4493       for (p = CALL_INSN_FUNCTION_USAGE (insn); p ; p = XEXP (p, 1))
4494         if (GET_CODE (XEXP (p, 0)) == USE
4495             && GET_CODE (XEXP (XEXP (p, 0), 0)) == REG)
4496           {
4497             int regno = REGNO (XEXP (XEXP (p, 0), 0));
4498             if (regno >= FIRST_PSEUDO_REGISTER)
4499               abort ();
4500             SET_HARD_REG_BIT (parm_regs, regno);
4501             nparm_regs++;
4502           }
4503
4504       /* Search backward for the first set of a register in this set.  */
4505       while (nparm_regs && BLOCK_HEAD (bb) != insn)
4506         {
4507           insn = PREV_INSN (insn);
4508           p = single_set (insn);
4509           if (p && GET_CODE (SET_DEST (p)) == REG
4510               && REGNO (SET_DEST (p)) < FIRST_PSEUDO_REGISTER
4511               && TEST_HARD_REG_BIT (parm_regs, REGNO (SET_DEST (p))))
4512             {
4513               CLEAR_HARD_REG_BIT (parm_regs, REGNO (SET_DEST (p)));
4514               nparm_regs--;
4515             }
4516         }
4517       
4518       new_insn = emit_insn_before (pat, insn);
4519       if (BLOCK_HEAD (bb) == insn)
4520         BLOCK_HEAD (bb) = new_insn;
4521     }
4522   else
4523     {
4524       new_insn = emit_insn_after (pat, insn);
4525       add_label_notes (SET_SRC (pat), new_insn);
4526       BLOCK_END (bb) = new_insn;
4527     }
4528
4529   /* Keep block number table up to date.  */
4530   set_block_num (new_insn, bb);
4531   /* Keep register set table up to date.  */
4532   record_one_set (regno, new_insn);
4533
4534   gcse_create_count++;
4535
4536   if (gcse_file)
4537     {
4538       fprintf (gcse_file, "PRE: end of bb %d, insn %d, copying expression %d to reg %d\n",
4539                bb, INSN_UID (new_insn), expr->bitmap_index, regno);
4540     }
4541 }
4542
4543 /* Insert partially redundant expressions at the ends of appropriate basic
4544    blocks making them now redundant.  */
4545
4546 static void
4547 pre_insert (index_map)
4548      struct expr **index_map;
4549 {
4550   int bb, i, size;
4551
4552   /* Compute INSERT = PPOUT & (~AVOUT) & (~PPIN | ~TRANSP) for each
4553      expression.  Where INSERT == TRUE, add the expression at the end of
4554      the basic block.  */
4555
4556   size = pre_ppout[0]->size;
4557   for (bb = 0; bb < n_basic_blocks; bb++)
4558     {
4559       int indx;
4560       sbitmap_ptr ppout = pre_ppout[bb]->elms;
4561       sbitmap_ptr avout = pre_avout[bb]->elms;
4562       sbitmap_ptr ppin = pre_ppin[bb]->elms;
4563       sbitmap_ptr transp = pre_transp[bb]->elms;
4564
4565       for (i = indx = 0;
4566            i < size;
4567            i++, indx += SBITMAP_ELT_BITS, ppout++, avout++, ppin++, transp++)
4568         {
4569           int j;
4570           SBITMAP_ELT_TYPE insert = *ppout & (~*avout) & (~*ppin | ~*transp);
4571
4572           for (j = indx; insert != 0 && j < n_exprs; j++, insert >>= 1)
4573             {
4574               if ((insert & 1) != 0
4575                   /* If the basic block isn't reachable, PPOUT will be TRUE.
4576                      However, we don't want to insert a copy here because the
4577                      expression may not really be redundant.  So only insert
4578                      an insn if the expression was deleted.  */
4579                   && index_map[j]->reaching_reg != NULL)
4580                 pre_insert_insn (index_map[j], bb);
4581             }
4582         }
4583     }
4584 }
4585
4586 /* Copy the result of INSN to REG.
4587    INDX is the expression number.  */
4588
4589 static void
4590 pre_insert_copy_insn (expr, insn)
4591      struct expr *expr;
4592      rtx insn;
4593 {
4594   rtx reg = expr->reaching_reg;
4595   int regno = REGNO (reg);
4596   int indx = expr->bitmap_index;
4597   rtx set = single_set (insn);
4598   rtx new_insn;
4599
4600   if (!set)
4601     abort ();
4602   new_insn = emit_insn_after (gen_rtx_SET (VOIDmode, reg, SET_DEST (set)),
4603                               insn);
4604   /* Keep block number table up to date.  */
4605   set_block_num (new_insn, BLOCK_NUM (insn));
4606   /* Keep register set table up to date.  */
4607   record_one_set (regno, new_insn);
4608
4609   gcse_create_count++;
4610
4611   if (gcse_file)
4612     {
4613       fprintf (gcse_file, "PRE: bb %d, insn %d, copying expression %d in insn %d to reg %d\n",
4614                BLOCK_NUM (insn), INSN_UID (new_insn), indx, INSN_UID (insn), regno);
4615     }
4616 }
4617
4618 /* Copy available expressions that reach the redundant expression
4619    to `reaching_reg'.  */
4620
4621 static void
4622 pre_insert_copies ()
4623 {
4624   int i;
4625
4626   /* For each available expression in the table, copy the result to
4627      `reaching_reg' if the expression reaches a deleted one.
4628
4629      ??? The current algorithm is rather brute force.
4630      Need to do some profiling.  */
4631
4632   for (i = 0; i < expr_hash_table_size; i++)
4633     {
4634       struct expr *expr;
4635
4636       for (expr = expr_hash_table[i]; expr != NULL; expr = expr->next_same_hash)
4637         {
4638           struct occr *occr;
4639
4640           /* If the basic block isn't reachable, PPOUT will be TRUE.
4641              However, we don't want to insert a copy here because the
4642              expression may not really be redundant.  So only insert
4643              an insn if the expression was deleted.
4644              This test also avoids further processing if the expression
4645              wasn't deleted anywhere.  */
4646           if (expr->reaching_reg == NULL)
4647             continue;
4648
4649           for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
4650             {
4651               struct occr *avail;
4652
4653               if (! occr->deleted_p)
4654                 continue;
4655
4656               for (avail = expr->avail_occr; avail != NULL; avail = avail->next)
4657                 {
4658                   rtx insn = avail->insn;
4659
4660                   /* No need to handle this one if handled already.  */
4661                   if (avail->copied_p)
4662                     continue;
4663                   /* Don't handle this one if it's a redundant one.  */
4664                   if (TEST_BIT (pre_redundant, INSN_CUID (insn)))
4665                     continue;
4666                   /* Or if the expression doesn't reach the deleted one.  */
4667                   if (! pre_expr_reaches_here_p (avail, expr,
4668                                                  BLOCK_NUM (occr->insn),
4669                                                  NULL))
4670                     continue;
4671
4672                   /* Copy the result of avail to reaching_reg.  */
4673                   pre_insert_copy_insn (expr, insn);
4674                   avail->copied_p = 1;
4675                 }
4676             }
4677         }
4678     }
4679 }
4680
4681 /* Delete redundant computations.
4682    These are ones that satisy ANTLOC & PPIN.
4683    Deletion is done by changing the insn to copy the `reaching_reg' of
4684    the expression into the result of the SET.  It is left to later passes
4685    (cprop, cse2, flow, combine, regmove) to propagate the copy or eliminate it.
4686
4687    Returns non-zero if a change is made.  */
4688
4689 static int
4690 pre_delete ()
4691 {
4692   int i, changed;
4693
4694   changed = 0;
4695   for (i = 0; i < expr_hash_table_size; i++)
4696     {
4697       struct expr *expr;
4698
4699       for (expr = expr_hash_table[i]; expr != NULL; expr = expr->next_same_hash)
4700         {
4701           struct occr *occr;
4702           int indx = expr->bitmap_index;
4703
4704           /* We only need to search antic_occr since we require
4705              ANTLOC != 0.  */
4706
4707           for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
4708             {
4709               rtx insn = occr->insn;
4710               rtx set;
4711               int bb = BLOCK_NUM (insn);
4712               sbitmap ppin = pre_ppin[bb];
4713
4714               if (TEST_BIT (ppin, indx))
4715                 {
4716                   set = single_set (insn);
4717                   if (! set)
4718                     abort ();
4719
4720                   /* Create a pseudo-reg to store the result of reaching
4721                      expressions into.  Get the mode for the new pseudo
4722                      from the mode of the original destination pseudo.  */
4723                   if (expr->reaching_reg == NULL)
4724                     expr->reaching_reg
4725                       = gen_reg_rtx (GET_MODE (SET_DEST (set)));
4726
4727                   /* In theory this should never fail since we're creating
4728                      a reg->reg copy.
4729
4730                      However, on the x86 some of the movXX patterns actually
4731                      contain clobbers of scratch regs.  This may cause the
4732                      insn created by validate_change to not patch any pattern
4733                      and thus cause validate_change to fail.   */
4734                   if (validate_change (insn, &SET_SRC (set),
4735                                        expr->reaching_reg, 0))
4736                     {
4737                       occr->deleted_p = 1;
4738                       SET_BIT (pre_redundant, INSN_CUID (insn));
4739                       changed = 1;
4740                       gcse_subst_count++;
4741                     }
4742
4743                   if (gcse_file)
4744                     {
4745                       fprintf (gcse_file, "PRE: redundant insn %d (expression %d) in bb %d, reaching reg is %d\n",
4746                                INSN_UID (insn), indx, bb, REGNO (expr->reaching_reg));
4747                     }
4748                 }
4749             }
4750         }
4751     }
4752
4753   return changed;
4754 }
4755
4756 /* Perform GCSE optimizations using PRE.
4757    This is called by one_pre_gcse_pass after all the dataflow analysis
4758    has been done.
4759
4760    This is based on the original Morel-Renvoise paper and Fred Chow's thesis.
4761
4762    The M-R paper uses "TRANSP" to describe an expression as being transparent
4763    in a block where as Chow's thesis uses "ALTERED".  We use TRANSP.
4764
4765    ??? A new pseudo reg is created to hold the reaching expression.
4766    The nice thing about the classical approach is that it would try to
4767    use an existing reg.  If the register can't be adequately optimized
4768    [i.e. we introduce reload problems], one could add a pass here to
4769    propagate the new register through the block.
4770
4771    ??? We don't handle single sets in PARALLELs because we're [currently]
4772    not able to copy the rest of the parallel when we insert copies to create
4773    full redundancies from partial redundancies.  However, there's no reason
4774    why we can't handle PARALLELs in the cases where there are no partial
4775    redundancies.  */
4776
4777 static int
4778 pre_gcse ()
4779 {
4780   int i;
4781   int changed;
4782   struct expr **index_map;
4783
4784   /* Compute a mapping from expression number (`bitmap_index') to
4785      hash table entry.  */
4786
4787   index_map = (struct expr **) alloca (n_exprs * sizeof (struct expr *));
4788   bzero ((char *) index_map, n_exprs * sizeof (struct expr *));
4789   for (i = 0; i < expr_hash_table_size; i++)
4790     {
4791       struct expr *expr;
4792
4793       for (expr = expr_hash_table[i]; expr != NULL; expr = expr->next_same_hash)
4794         index_map[expr->bitmap_index] = expr;
4795     }
4796
4797   /* Reset bitmap used to track which insns are redundant.  */
4798   pre_redundant = sbitmap_alloc (max_cuid);
4799   sbitmap_zero (pre_redundant);
4800
4801   /* Delete the redundant insns first so that
4802      - we know what register to use for the new insns and for the other
4803        ones with reaching expressions
4804      - we know which insns are redundant when we go to create copies  */
4805   changed = pre_delete ();
4806
4807   /* Insert insns in places that make partially redundant expressions
4808      fully redundant.  */
4809   pre_insert (index_map);
4810
4811   /* In other places with reaching expressions, copy the expression to the
4812      specially allocated pseudo-reg that reaches the redundant expression.  */
4813   pre_insert_copies ();
4814
4815   free (pre_redundant);
4816
4817   return changed;
4818 }
4819
4820 /* Top level routine to perform one PRE GCSE pass.
4821
4822    Return non-zero if a change was made.  */
4823
4824 static int
4825 one_pre_gcse_pass (f, pass)
4826      rtx f;
4827      int pass;
4828 {
4829   int changed = 0;
4830
4831   gcse_subst_count = 0;
4832   gcse_create_count = 0;
4833
4834   alloc_expr_hash_table (max_cuid);
4835   compute_expr_hash_table (f);
4836   if (gcse_file)
4837     dump_hash_table (gcse_file, "Expression", expr_hash_table,
4838                      expr_hash_table_size, n_exprs);
4839   if (n_exprs > 0)
4840     {
4841       alloc_pre_mem (n_basic_blocks, n_exprs);
4842       compute_pre_data ();
4843       changed |= pre_gcse ();
4844       free_pre_mem ();
4845     }
4846   free_expr_hash_table ();
4847
4848   if (gcse_file)
4849     {
4850       fprintf (gcse_file, "\n");
4851       fprintf (gcse_file, "PRE GCSE of %s, pass %d: %d bytes needed, %d substs, %d insns created\n",
4852                current_function_name, pass,
4853                bytes_used, gcse_subst_count, gcse_create_count);
4854     }
4855
4856   return changed;
4857 }
4858 \f
4859 /* If X contains any LABEL_REF's, add REG_LABEL notes for them to INSN.
4860    We have to add REG_LABEL notes, because the following loop optimization
4861    pass requires them.  */
4862
4863 /* ??? This is very similar to the loop.c add_label_notes function.  We
4864    could probably share code here.  */
4865
4866 /* ??? If there was a jump optimization pass after gcse and before loop,
4867    then we would not need to do this here, because jump would add the
4868    necessary REG_LABEL notes.  */
4869
4870 static void
4871 add_label_notes (x, insn)
4872      rtx x;
4873      rtx insn;
4874 {
4875   enum rtx_code code = GET_CODE (x);
4876   int i, j;
4877   char *fmt;
4878
4879   if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
4880     {
4881       /* This code used to ignore labels that referred to dispatch tables to
4882          avoid flow generating (slighly) worse code.
4883
4884          We no longer ignore such label references (see LABEL_REF handling in
4885          mark_jump_label for additional information).  */
4886       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_LABEL, XEXP (x, 0),
4887                                             REG_NOTES (insn));
4888       return;
4889     }
4890
4891   fmt = GET_RTX_FORMAT (code);
4892   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4893     {
4894       if (fmt[i] == 'e')
4895         add_label_notes (XEXP (x, i), insn);
4896       else if (fmt[i] == 'E')
4897         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
4898           add_label_notes (XVECEXP (x, i, j), insn);
4899     }
4900 }