Update copyright years.
[platform/upstream/gcc.git] / gcc / gcse.c
1 /* Partial redundancy elimination / Hoisting for RTL.
2    Copyright (C) 1997-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 /* TODO
21    - reordering of memory allocation and freeing to be more space efficient
22    - calc rough register pressure information and use the info to drive all
23      kinds of code motion (including code hoisting) in a unified way.
24 */
25
26 /* References searched while implementing this.
27
28    Compilers Principles, Techniques and Tools
29    Aho, Sethi, Ullman
30    Addison-Wesley, 1988
31
32    Global Optimization by Suppression of Partial Redundancies
33    E. Morel, C. Renvoise
34    communications of the acm, Vol. 22, Num. 2, Feb. 1979
35
36    A Portable Machine-Independent Global Optimizer - Design and Measurements
37    Frederick Chow
38    Stanford Ph.D. thesis, Dec. 1983
39
40    A Fast Algorithm for Code Movement Optimization
41    D.M. Dhamdhere
42    SIGPLAN Notices, Vol. 23, Num. 10, Oct. 1988
43
44    A Solution to a Problem with Morel and Renvoise's
45    Global Optimization by Suppression of Partial Redundancies
46    K-H Drechsler, M.P. Stadel
47    ACM TOPLAS, Vol. 10, Num. 4, Oct. 1988
48
49    Practical Adaptation of the Global Optimization
50    Algorithm of Morel and Renvoise
51    D.M. Dhamdhere
52    ACM TOPLAS, Vol. 13, Num. 2. Apr. 1991
53
54    Efficiently Computing Static Single Assignment Form and the Control
55    Dependence Graph
56    R. Cytron, J. Ferrante, B.K. Rosen, M.N. Wegman, and F.K. Zadeck
57    ACM TOPLAS, Vol. 13, Num. 4, Oct. 1991
58
59    Lazy Code Motion
60    J. Knoop, O. Ruthing, B. Steffen
61    ACM SIGPLAN Notices Vol. 27, Num. 7, Jul. 1992, '92 Conference on PLDI
62
63    What's In a Region?  Or Computing Control Dependence Regions in Near-Linear
64    Time for Reducible Flow Control
65    Thomas Ball
66    ACM Letters on Programming Languages and Systems,
67    Vol. 2, Num. 1-4, Mar-Dec 1993
68
69    An Efficient Representation for Sparse Sets
70    Preston Briggs, Linda Torczon
71    ACM Letters on Programming Languages and Systems,
72    Vol. 2, Num. 1-4, Mar-Dec 1993
73
74    A Variation of Knoop, Ruthing, and Steffen's Lazy Code Motion
75    K-H Drechsler, M.P. Stadel
76    ACM SIGPLAN Notices, Vol. 28, Num. 5, May 1993
77
78    Partial Dead Code Elimination
79    J. Knoop, O. Ruthing, B. Steffen
80    ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
81
82    Effective Partial Redundancy Elimination
83    P. Briggs, K.D. Cooper
84    ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
85
86    The Program Structure Tree: Computing Control Regions in Linear Time
87    R. Johnson, D. Pearson, K. Pingali
88    ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
89
90    Optimal Code Motion: Theory and Practice
91    J. Knoop, O. Ruthing, B. Steffen
92    ACM TOPLAS, Vol. 16, Num. 4, Jul. 1994
93
94    The power of assignment motion
95    J. Knoop, O. Ruthing, B. Steffen
96    ACM SIGPLAN Notices Vol. 30, Num. 6, Jun. 1995, '95 Conference on PLDI
97
98    Global code motion / global value numbering
99    C. Click
100    ACM SIGPLAN Notices Vol. 30, Num. 6, Jun. 1995, '95 Conference on PLDI
101
102    Value Driven Redundancy Elimination
103    L.T. Simpson
104    Rice University Ph.D. thesis, Apr. 1996
105
106    Value Numbering
107    L.T. Simpson
108    Massively Scalar Compiler Project, Rice University, Sep. 1996
109
110    High Performance Compilers for Parallel Computing
111    Michael Wolfe
112    Addison-Wesley, 1996
113
114    Advanced Compiler Design and Implementation
115    Steven Muchnick
116    Morgan Kaufmann, 1997
117
118    Building an Optimizing Compiler
119    Robert Morgan
120    Digital Press, 1998
121
122    People wishing to speed up the code here should read:
123      Elimination Algorithms for Data Flow Analysis
124      B.G. Ryder, M.C. Paull
125      ACM Computing Surveys, Vol. 18, Num. 3, Sep. 1986
126
127      How to Analyze Large Programs Efficiently and Informatively
128      D.M. Dhamdhere, B.K. Rosen, F.K. Zadeck
129      ACM SIGPLAN Notices Vol. 27, Num. 7, Jul. 1992, '92 Conference on PLDI
130
131    People wishing to do something different can find various possibilities
132    in the above papers and elsewhere.
133 */
134
135 #include "config.h"
136 #include "system.h"
137 #include "coretypes.h"
138 #include "tm.h"
139 #include "diagnostic-core.h"
140 #include "toplev.h"
141
142 #include "hard-reg-set.h"
143 #include "rtl.h"
144 #include "tree.h"
145 #include "tm_p.h"
146 #include "regs.h"
147 #include "ira.h"
148 #include "flags.h"
149 #include "insn-config.h"
150 #include "recog.h"
151 #include "predict.h"
152 #include "vec.h"
153 #include "hashtab.h"
154 #include "hash-set.h"
155 #include "machmode.h"
156 #include "input.h"
157 #include "function.h"
158 #include "dominance.h"
159 #include "cfg.h"
160 #include "cfgrtl.h"
161 #include "cfganal.h"
162 #include "lcm.h"
163 #include "cfgcleanup.h"
164 #include "basic-block.h"
165 #include "expr.h"
166 #include "except.h"
167 #include "ggc.h"
168 #include "params.h"
169 #include "cselib.h"
170 #include "intl.h"
171 #include "obstack.h"
172 #include "tree-pass.h"
173 #include "hash-table.h"
174 #include "df.h"
175 #include "dbgcnt.h"
176 #include "target.h"
177 #include "gcse.h"
178
179 /* We support GCSE via Partial Redundancy Elimination.  PRE optimizations
180    are a superset of those done by classic GCSE.
181
182    Two passes of copy/constant propagation are done around PRE or hoisting
183    because the first one enables more GCSE and the second one helps to clean
184    up the copies that PRE and HOIST create.  This is needed more for PRE than
185    for HOIST because code hoisting will try to use an existing register
186    containing the common subexpression rather than create a new one.  This is
187    harder to do for PRE because of the code motion (which HOIST doesn't do).
188
189    Expressions we are interested in GCSE-ing are of the form
190    (set (pseudo-reg) (expression)).
191    Function want_to_gcse_p says what these are.
192
193    In addition, expressions in REG_EQUAL notes are candidates for GCSE-ing.
194    This allows PRE to hoist expressions that are expressed in multiple insns,
195    such as complex address calculations (e.g. for PIC code, or loads with a
196    high part and a low part).
197
198    PRE handles moving invariant expressions out of loops (by treating them as
199    partially redundant).
200
201    **********************
202
203    We used to support multiple passes but there are diminishing returns in
204    doing so.  The first pass usually makes 90% of the changes that are doable.
205    A second pass can make a few more changes made possible by the first pass.
206    Experiments show any further passes don't make enough changes to justify
207    the expense.
208
209    A study of spec92 using an unlimited number of passes:
210    [1 pass] = 1208 substitutions, [2] = 577, [3] = 202, [4] = 192, [5] = 83,
211    [6] = 34, [7] = 17, [8] = 9, [9] = 4, [10] = 4, [11] = 2,
212    [12] = 2, [13] = 1, [15] = 1, [16] = 2, [41] = 1
213
214    It was found doing copy propagation between each pass enables further
215    substitutions.
216
217    This study was done before expressions in REG_EQUAL notes were added as
218    candidate expressions for optimization, and before the GIMPLE optimizers
219    were added.  Probably, multiple passes is even less efficient now than
220    at the time when the study was conducted.
221
222    PRE is quite expensive in complicated functions because the DFA can take
223    a while to converge.  Hence we only perform one pass.
224
225    **********************
226
227    The steps for PRE are:
228
229    1) Build the hash table of expressions we wish to GCSE (expr_hash_table).
230
231    2) Perform the data flow analysis for PRE.
232
233    3) Delete the redundant instructions
234
235    4) Insert the required copies [if any] that make the partially
236       redundant instructions fully redundant.
237
238    5) For other reaching expressions, insert an instruction to copy the value
239       to a newly created pseudo that will reach the redundant instruction.
240
241    The deletion is done first so that when we do insertions we
242    know which pseudo reg to use.
243
244    Various papers have argued that PRE DFA is expensive (O(n^2)) and others
245    argue it is not.  The number of iterations for the algorithm to converge
246    is typically 2-4 so I don't view it as that expensive (relatively speaking).
247
248    PRE GCSE depends heavily on the second CPROP pass to clean up the copies
249    we create.  To make an expression reach the place where it's redundant,
250    the result of the expression is copied to a new register, and the redundant
251    expression is deleted by replacing it with this new register.  Classic GCSE
252    doesn't have this problem as much as it computes the reaching defs of
253    each register in each block and thus can try to use an existing
254    register.  */
255 \f
256 /* GCSE global vars.  */
257
258 struct target_gcse default_target_gcse;
259 #if SWITCHABLE_TARGET
260 struct target_gcse *this_target_gcse = &default_target_gcse;
261 #endif
262
263 /* Set to non-zero if CSE should run after all GCSE optimizations are done.  */
264 int flag_rerun_cse_after_global_opts;
265
266 /* An obstack for our working variables.  */
267 static struct obstack gcse_obstack;
268
269 /* Hash table of expressions.  */
270
271 struct gcse_expr
272 {
273   /* The expression.  */
274   rtx expr;
275   /* Index in the available expression bitmaps.  */
276   int bitmap_index;
277   /* Next entry with the same hash.  */
278   struct gcse_expr *next_same_hash;
279   /* List of anticipatable occurrences in basic blocks in the function.
280      An "anticipatable occurrence" is one that is the first occurrence in the
281      basic block, the operands are not modified in the basic block prior
282      to the occurrence and the output is not used between the start of
283      the block and the occurrence.  */
284   struct gcse_occr *antic_occr;
285   /* List of available occurrence in basic blocks in the function.
286      An "available occurrence" is one that is the last occurrence in the
287      basic block and the operands are not modified by following statements in
288      the basic block [including this insn].  */
289   struct gcse_occr *avail_occr;
290   /* Non-null if the computation is PRE redundant.
291      The value is the newly created pseudo-reg to record a copy of the
292      expression in all the places that reach the redundant copy.  */
293   rtx reaching_reg;
294   /* Maximum distance in instructions this expression can travel.
295      We avoid moving simple expressions for more than a few instructions
296      to keep register pressure under control.
297      A value of "0" removes restrictions on how far the expression can
298      travel.  */
299   int max_distance;
300 };
301
302 /* Occurrence of an expression.
303    There is one per basic block.  If a pattern appears more than once the
304    last appearance is used [or first for anticipatable expressions].  */
305
306 struct gcse_occr
307 {
308   /* Next occurrence of this expression.  */
309   struct gcse_occr *next;
310   /* The insn that computes the expression.  */
311   rtx_insn *insn;
312   /* Nonzero if this [anticipatable] occurrence has been deleted.  */
313   char deleted_p;
314   /* Nonzero if this [available] occurrence has been copied to
315      reaching_reg.  */
316   /* ??? This is mutually exclusive with deleted_p, so they could share
317      the same byte.  */
318   char copied_p;
319 };
320
321 typedef struct gcse_occr *occr_t;
322
323 /* Expression hash tables.
324    Each hash table is an array of buckets.
325    ??? It is known that if it were an array of entries, structure elements
326    `next_same_hash' and `bitmap_index' wouldn't be necessary.  However, it is
327    not clear whether in the final analysis a sufficient amount of memory would
328    be saved as the size of the available expression bitmaps would be larger
329    [one could build a mapping table without holes afterwards though].
330    Someday I'll perform the computation and figure it out.  */
331
332 struct gcse_hash_table_d
333 {
334   /* The table itself.
335      This is an array of `expr_hash_table_size' elements.  */
336   struct gcse_expr **table;
337
338   /* Size of the hash table, in elements.  */
339   unsigned int size;
340
341   /* Number of hash table elements.  */
342   unsigned int n_elems;
343 };
344
345 /* Expression hash table.  */
346 static struct gcse_hash_table_d expr_hash_table;
347
348 /* This is a list of expressions which are MEMs and will be used by load
349    or store motion.
350    Load motion tracks MEMs which aren't killed by anything except itself,
351    i.e. loads and stores to a single location.
352    We can then allow movement of these MEM refs with a little special
353    allowance. (all stores copy the same value to the reaching reg used
354    for the loads).  This means all values used to store into memory must have
355    no side effects so we can re-issue the setter value.  */
356
357 struct ls_expr
358 {
359   struct gcse_expr * expr;      /* Gcse expression reference for LM.  */
360   rtx pattern;                  /* Pattern of this mem.  */
361   rtx pattern_regs;             /* List of registers mentioned by the mem.  */
362   rtx_insn_list *loads;         /* INSN list of loads seen.  */
363   rtx_insn_list *stores;        /* INSN list of stores seen.  */
364   struct ls_expr * next;        /* Next in the list.  */
365   int invalid;                  /* Invalid for some reason.  */
366   int index;                    /* If it maps to a bitmap index.  */
367   unsigned int hash_index;      /* Index when in a hash table.  */
368   rtx reaching_reg;             /* Register to use when re-writing.  */
369 };
370
371 /* Head of the list of load/store memory refs.  */
372 static struct ls_expr * pre_ldst_mems = NULL;
373
374 struct pre_ldst_expr_hasher : typed_noop_remove <ls_expr>
375 {
376   typedef ls_expr value_type;
377   typedef value_type compare_type;
378   static inline hashval_t hash (const value_type *);
379   static inline bool equal (const value_type *, const compare_type *);
380 };
381
382 /* Hashtable helpers.  */
383 inline hashval_t
384 pre_ldst_expr_hasher::hash (const value_type *x)
385 {
386   int do_not_record_p = 0;
387   return
388     hash_rtx (x->pattern, GET_MODE (x->pattern), &do_not_record_p, NULL, false);
389 }
390
391 static int expr_equiv_p (const_rtx, const_rtx);
392
393 inline bool
394 pre_ldst_expr_hasher::equal (const value_type *ptr1,
395                              const compare_type *ptr2)
396 {
397   return expr_equiv_p (ptr1->pattern, ptr2->pattern);
398 }
399
400 /* Hashtable for the load/store memory refs.  */
401 static hash_table<pre_ldst_expr_hasher> *pre_ldst_table;
402
403 /* Bitmap containing one bit for each register in the program.
404    Used when performing GCSE to track which registers have been set since
405    the start of the basic block.  */
406 static regset reg_set_bitmap;
407
408 /* Array, indexed by basic block number for a list of insns which modify
409    memory within that block.  */
410 static vec<rtx_insn *> *modify_mem_list;
411 static bitmap modify_mem_list_set;
412
413 typedef struct modify_pair_s
414 {
415   rtx dest;                     /* A MEM.  */
416   rtx dest_addr;                /* The canonical address of `dest'.  */
417 } modify_pair;
418
419
420 /* This array parallels modify_mem_list, except that it stores MEMs
421    being set and their canonicalized memory addresses.  */
422 static vec<modify_pair> *canon_modify_mem_list;
423
424 /* Bitmap indexed by block numbers to record which blocks contain
425    function calls.  */
426 static bitmap blocks_with_calls;
427
428 /* Various variables for statistics gathering.  */
429
430 /* Memory used in a pass.
431    This isn't intended to be absolutely precise.  Its intent is only
432    to keep an eye on memory usage.  */
433 static int bytes_used;
434
435 /* GCSE substitutions made.  */
436 static int gcse_subst_count;
437 /* Number of copy instructions created.  */
438 static int gcse_create_count;
439 \f
440 /* Doing code hoisting.  */
441 static bool doing_code_hoisting_p = false;
442 \f
443 /* For available exprs */
444 static sbitmap *ae_kill;
445 \f
446 /* Data stored for each basic block.  */
447 struct bb_data
448 {
449   /* Maximal register pressure inside basic block for given register class
450      (defined only for the pressure classes).  */
451   int max_reg_pressure[N_REG_CLASSES];
452   /* Recorded register pressure of basic block before trying to hoist
453      an expression.  Will be used to restore the register pressure
454      if the expression should not be hoisted.  */
455   int old_pressure;
456   /* Recorded register live_in info of basic block during code hoisting
457      process.  BACKUP is used to record live_in info before trying to
458      hoist an expression, and will be used to restore LIVE_IN if the
459      expression should not be hoisted.  */
460   bitmap live_in, backup;
461 };
462
463 #define BB_DATA(bb) ((struct bb_data *) (bb)->aux)
464
465 static basic_block curr_bb;
466
467 /* Current register pressure for each pressure class.  */
468 static int curr_reg_pressure[N_REG_CLASSES];
469 \f
470
471 static void compute_can_copy (void);
472 static void *gmalloc (size_t) ATTRIBUTE_MALLOC;
473 static void *gcalloc (size_t, size_t) ATTRIBUTE_MALLOC;
474 static void *gcse_alloc (unsigned long);
475 static void alloc_gcse_mem (void);
476 static void free_gcse_mem (void);
477 static void hash_scan_insn (rtx_insn *, struct gcse_hash_table_d *);
478 static void hash_scan_set (rtx, rtx_insn *, struct gcse_hash_table_d *);
479 static void hash_scan_clobber (rtx, rtx_insn *, struct gcse_hash_table_d *);
480 static void hash_scan_call (rtx, rtx_insn *, struct gcse_hash_table_d *);
481 static int want_to_gcse_p (rtx, int *);
482 static int oprs_unchanged_p (const_rtx, const rtx_insn *, int);
483 static int oprs_anticipatable_p (const_rtx, const rtx_insn *);
484 static int oprs_available_p (const_rtx, const rtx_insn *);
485 static void insert_expr_in_table (rtx, machine_mode, rtx_insn *, int, int,
486                                   int, struct gcse_hash_table_d *);
487 static unsigned int hash_expr (const_rtx, machine_mode, int *, int);
488 static void record_last_reg_set_info (rtx, int);
489 static void record_last_mem_set_info (rtx_insn *);
490 static void record_last_set_info (rtx, const_rtx, void *);
491 static void compute_hash_table (struct gcse_hash_table_d *);
492 static void alloc_hash_table (struct gcse_hash_table_d *);
493 static void free_hash_table (struct gcse_hash_table_d *);
494 static void compute_hash_table_work (struct gcse_hash_table_d *);
495 static void dump_hash_table (FILE *, const char *, struct gcse_hash_table_d *);
496 static void compute_transp (const_rtx, int, sbitmap *);
497 static void compute_local_properties (sbitmap *, sbitmap *, sbitmap *,
498                                       struct gcse_hash_table_d *);
499 static void mems_conflict_for_gcse_p (rtx, const_rtx, void *);
500 static int load_killed_in_block_p (const_basic_block, int, const_rtx, int);
501 static void canon_list_insert (rtx, const_rtx, void *);
502 static void alloc_pre_mem (int, int);
503 static void free_pre_mem (void);
504 static struct edge_list *compute_pre_data (void);
505 static int pre_expr_reaches_here_p (basic_block, struct gcse_expr *,
506                                     basic_block);
507 static void insert_insn_end_basic_block (struct gcse_expr *, basic_block);
508 static void pre_insert_copy_insn (struct gcse_expr *, rtx_insn *);
509 static void pre_insert_copies (void);
510 static int pre_delete (void);
511 static int pre_gcse (struct edge_list *);
512 static int one_pre_gcse_pass (void);
513 static void add_label_notes (rtx, rtx);
514 static void alloc_code_hoist_mem (int, int);
515 static void free_code_hoist_mem (void);
516 static void compute_code_hoist_vbeinout (void);
517 static void compute_code_hoist_data (void);
518 static int should_hoist_expr_to_dom (basic_block, struct gcse_expr *, basic_block,
519                                      sbitmap, int, int *, enum reg_class,
520                                      int *, bitmap, rtx_insn *);
521 static int hoist_code (void);
522 static enum reg_class get_regno_pressure_class (int regno, int *nregs);
523 static enum reg_class get_pressure_class_and_nregs (rtx_insn *insn, int *nregs);
524 static int one_code_hoisting_pass (void);
525 static rtx_insn *process_insert_insn (struct gcse_expr *);
526 static int pre_edge_insert (struct edge_list *, struct gcse_expr **);
527 static int pre_expr_reaches_here_p_work (basic_block, struct gcse_expr *,
528                                          basic_block, char *);
529 static struct ls_expr * ldst_entry (rtx);
530 static void free_ldst_entry (struct ls_expr *);
531 static void free_ld_motion_mems (void);
532 static void print_ldst_list (FILE *);
533 static struct ls_expr * find_rtx_in_ldst (rtx);
534 static int simple_mem (const_rtx);
535 static void invalidate_any_buried_refs (rtx);
536 static void compute_ld_motion_mems (void);
537 static void trim_ld_motion_mems (void);
538 static void update_ld_motion_stores (struct gcse_expr *);
539 static void clear_modify_mem_tables (void);
540 static void free_modify_mem_tables (void);
541 static rtx gcse_emit_move_after (rtx, rtx, rtx_insn *);
542 static bool is_too_expensive (const char *);
543
544 #define GNEW(T)                 ((T *) gmalloc (sizeof (T)))
545 #define GCNEW(T)                ((T *) gcalloc (1, sizeof (T)))
546
547 #define GNEWVEC(T, N)           ((T *) gmalloc (sizeof (T) * (N)))
548 #define GCNEWVEC(T, N)          ((T *) gcalloc ((N), sizeof (T)))
549
550 #define GNEWVAR(T, S)           ((T *) gmalloc ((S)))
551 #define GCNEWVAR(T, S)          ((T *) gcalloc (1, (S)))
552
553 #define GOBNEW(T)               ((T *) gcse_alloc (sizeof (T)))
554 #define GOBNEWVAR(T, S)         ((T *) gcse_alloc ((S)))
555 \f
556 /* Misc. utilities.  */
557
558 #define can_copy \
559   (this_target_gcse->x_can_copy)
560 #define can_copy_init_p \
561   (this_target_gcse->x_can_copy_init_p)
562
563 /* Compute which modes support reg/reg copy operations.  */
564
565 static void
566 compute_can_copy (void)
567 {
568   int i;
569 #ifndef AVOID_CCMODE_COPIES
570   rtx reg, insn;
571 #endif
572   memset (can_copy, 0, NUM_MACHINE_MODES);
573
574   start_sequence ();
575   for (i = 0; i < NUM_MACHINE_MODES; i++)
576     if (GET_MODE_CLASS (i) == MODE_CC)
577       {
578 #ifdef AVOID_CCMODE_COPIES
579         can_copy[i] = 0;
580 #else
581         reg = gen_rtx_REG ((machine_mode) i, LAST_VIRTUAL_REGISTER + 1);
582         insn = emit_insn (gen_rtx_SET (VOIDmode, reg, reg));
583         if (recog (PATTERN (insn), insn, NULL) >= 0)
584           can_copy[i] = 1;
585 #endif
586       }
587     else
588       can_copy[i] = 1;
589
590   end_sequence ();
591 }
592
593 /* Returns whether the mode supports reg/reg copy operations.  */
594
595 bool
596 can_copy_p (machine_mode mode)
597 {
598   if (! can_copy_init_p)
599     {
600       compute_can_copy ();
601       can_copy_init_p = true;
602     }
603
604   return can_copy[mode] != 0;
605 }
606 \f
607 /* Cover function to xmalloc to record bytes allocated.  */
608
609 static void *
610 gmalloc (size_t size)
611 {
612   bytes_used += size;
613   return xmalloc (size);
614 }
615
616 /* Cover function to xcalloc to record bytes allocated.  */
617
618 static void *
619 gcalloc (size_t nelem, size_t elsize)
620 {
621   bytes_used += nelem * elsize;
622   return xcalloc (nelem, elsize);
623 }
624
625 /* Cover function to obstack_alloc.  */
626
627 static void *
628 gcse_alloc (unsigned long size)
629 {
630   bytes_used += size;
631   return obstack_alloc (&gcse_obstack, size);
632 }
633
634 /* Allocate memory for the reg/memory set tracking tables.
635    This is called at the start of each pass.  */
636
637 static void
638 alloc_gcse_mem (void)
639 {
640   /* Allocate vars to track sets of regs.  */
641   reg_set_bitmap = ALLOC_REG_SET (NULL);
642
643   /* Allocate array to keep a list of insns which modify memory in each
644      basic block.  The two typedefs are needed to work around the
645      pre-processor limitation with template types in macro arguments.  */
646   typedef vec<rtx_insn *> vec_rtx_heap;
647   typedef vec<modify_pair> vec_modify_pair_heap;
648   modify_mem_list = GCNEWVEC (vec_rtx_heap, last_basic_block_for_fn (cfun));
649   canon_modify_mem_list = GCNEWVEC (vec_modify_pair_heap,
650                                     last_basic_block_for_fn (cfun));
651   modify_mem_list_set = BITMAP_ALLOC (NULL);
652   blocks_with_calls = BITMAP_ALLOC (NULL);
653 }
654
655 /* Free memory allocated by alloc_gcse_mem.  */
656
657 static void
658 free_gcse_mem (void)
659 {
660   FREE_REG_SET (reg_set_bitmap);
661
662   free_modify_mem_tables ();
663   BITMAP_FREE (modify_mem_list_set);
664   BITMAP_FREE (blocks_with_calls);
665 }
666 \f
667 /* Compute the local properties of each recorded expression.
668
669    Local properties are those that are defined by the block, irrespective of
670    other blocks.
671
672    An expression is transparent in a block if its operands are not modified
673    in the block.
674
675    An expression is computed (locally available) in a block if it is computed
676    at least once and expression would contain the same value if the
677    computation was moved to the end of the block.
678
679    An expression is locally anticipatable in a block if it is computed at
680    least once and expression would contain the same value if the computation
681    was moved to the beginning of the block.
682
683    We call this routine for pre and code hoisting.  They all compute
684    basically the same information and thus can easily share this code.
685
686    TRANSP, COMP, and ANTLOC are destination sbitmaps for recording local
687    properties.  If NULL, then it is not necessary to compute or record that
688    particular property.
689
690    TABLE controls which hash table to look at.  */
691
692 static void
693 compute_local_properties (sbitmap *transp, sbitmap *comp, sbitmap *antloc,
694                           struct gcse_hash_table_d *table)
695 {
696   unsigned int i;
697
698   /* Initialize any bitmaps that were passed in.  */
699   if (transp)
700     {
701       bitmap_vector_ones (transp, last_basic_block_for_fn (cfun));
702     }
703
704   if (comp)
705     bitmap_vector_clear (comp, last_basic_block_for_fn (cfun));
706   if (antloc)
707     bitmap_vector_clear (antloc, last_basic_block_for_fn (cfun));
708
709   for (i = 0; i < table->size; i++)
710     {
711       struct gcse_expr *expr;
712
713       for (expr = table->table[i]; expr != NULL; expr = expr->next_same_hash)
714         {
715           int indx = expr->bitmap_index;
716           struct gcse_occr *occr;
717
718           /* The expression is transparent in this block if it is not killed.
719              We start by assuming all are transparent [none are killed], and
720              then reset the bits for those that are.  */
721           if (transp)
722             compute_transp (expr->expr, indx, transp);
723
724           /* The occurrences recorded in antic_occr are exactly those that
725              we want to set to nonzero in ANTLOC.  */
726           if (antloc)
727             for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
728               {
729                 bitmap_set_bit (antloc[BLOCK_FOR_INSN (occr->insn)->index], indx);
730
731                 /* While we're scanning the table, this is a good place to
732                    initialize this.  */
733                 occr->deleted_p = 0;
734               }
735
736           /* The occurrences recorded in avail_occr are exactly those that
737              we want to set to nonzero in COMP.  */
738           if (comp)
739             for (occr = expr->avail_occr; occr != NULL; occr = occr->next)
740               {
741                 bitmap_set_bit (comp[BLOCK_FOR_INSN (occr->insn)->index], indx);
742
743                 /* While we're scanning the table, this is a good place to
744                    initialize this.  */
745                 occr->copied_p = 0;
746               }
747
748           /* While we're scanning the table, this is a good place to
749              initialize this.  */
750           expr->reaching_reg = 0;
751         }
752     }
753 }
754 \f
755 /* Hash table support.  */
756
757 struct reg_avail_info
758 {
759   basic_block last_bb;
760   int first_set;
761   int last_set;
762 };
763
764 static struct reg_avail_info *reg_avail_info;
765 static basic_block current_bb;
766
767 /* See whether X, the source of a set, is something we want to consider for
768    GCSE.  */
769
770 static int
771 want_to_gcse_p (rtx x, int *max_distance_ptr)
772 {
773 #ifdef STACK_REGS
774   /* On register stack architectures, don't GCSE constants from the
775      constant pool, as the benefits are often swamped by the overhead
776      of shuffling the register stack between basic blocks.  */
777   if (IS_STACK_MODE (GET_MODE (x)))
778     x = avoid_constant_pool_reference (x);
779 #endif
780
781   /* GCSE'ing constants:
782
783      We do not specifically distinguish between constant and non-constant
784      expressions in PRE and Hoist.  We use set_src_cost below to limit
785      the maximum distance simple expressions can travel.
786
787      Nevertheless, constants are much easier to GCSE, and, hence,
788      it is easy to overdo the optimizations.  Usually, excessive PRE and
789      Hoisting of constant leads to increased register pressure.
790
791      RA can deal with this by rematerialing some of the constants.
792      Therefore, it is important that the back-end generates sets of constants
793      in a way that allows reload rematerialize them under high register
794      pressure, i.e., a pseudo register with REG_EQUAL to constant
795      is set only once.  Failing to do so will result in IRA/reload
796      spilling such constants under high register pressure instead of
797      rematerializing them.  */
798
799   switch (GET_CODE (x))
800     {
801     case REG:
802     case SUBREG:
803     case CALL:
804       return 0;
805
806     CASE_CONST_ANY:
807       if (!doing_code_hoisting_p)
808         /* Do not PRE constants.  */
809         return 0;
810
811       /* FALLTHRU */
812
813     default:
814       if (doing_code_hoisting_p)
815         /* PRE doesn't implement max_distance restriction.  */
816         {
817           int cost;
818           int max_distance;
819
820           gcc_assert (!optimize_function_for_speed_p (cfun)
821                       && optimize_function_for_size_p (cfun));
822           cost = set_src_cost (x, 0);
823
824           if (cost < COSTS_N_INSNS (GCSE_UNRESTRICTED_COST))
825             {
826               max_distance = (GCSE_COST_DISTANCE_RATIO * cost) / 10;
827               if (max_distance == 0)
828                 return 0;
829
830               gcc_assert (max_distance > 0);
831             }
832           else
833             max_distance = 0;
834
835           if (max_distance_ptr)
836             *max_distance_ptr = max_distance;
837         }
838
839       return can_assign_to_reg_without_clobbers_p (x);
840     }
841 }
842
843 /* Used internally by can_assign_to_reg_without_clobbers_p.  */
844
845 static GTY(()) rtx_insn *test_insn;
846
847 /* Return true if we can assign X to a pseudo register such that the
848    resulting insn does not result in clobbering a hard register as a
849    side-effect.
850
851    Additionally, if the target requires it, check that the resulting insn
852    can be copied.  If it cannot, this means that X is special and probably
853    has hidden side-effects we don't want to mess with.
854
855    This function is typically used by code motion passes, to verify
856    that it is safe to insert an insn without worrying about clobbering
857    maybe live hard regs.  */
858
859 bool
860 can_assign_to_reg_without_clobbers_p (rtx x)
861 {
862   int num_clobbers = 0;
863   int icode;
864   bool can_assign = false;
865
866   /* If this is a valid operand, we are OK.  If it's VOIDmode, we aren't.  */
867   if (general_operand (x, GET_MODE (x)))
868     return 1;
869   else if (GET_MODE (x) == VOIDmode)
870     return 0;
871
872   /* Otherwise, check if we can make a valid insn from it.  First initialize
873      our test insn if we haven't already.  */
874   if (test_insn == 0)
875     {
876       test_insn
877         = make_insn_raw (gen_rtx_SET (VOIDmode,
878                                       gen_rtx_REG (word_mode,
879                                                    FIRST_PSEUDO_REGISTER * 2),
880                                       const0_rtx));
881       SET_NEXT_INSN (test_insn) = SET_PREV_INSN (test_insn) = 0;
882       INSN_LOCATION (test_insn) = UNKNOWN_LOCATION;
883     }
884
885   /* Now make an insn like the one we would make when GCSE'ing and see if
886      valid.  */
887   PUT_MODE (SET_DEST (PATTERN (test_insn)), GET_MODE (x));
888   SET_SRC (PATTERN (test_insn)) = x;
889
890   icode = recog (PATTERN (test_insn), test_insn, &num_clobbers);
891
892   /* If the test insn is valid and doesn't need clobbers, and the target also
893      has no objections, we're good.  */
894   if (icode >= 0
895       && (num_clobbers == 0 || !added_clobbers_hard_reg_p (icode))
896       && ! (targetm.cannot_copy_insn_p
897             && targetm.cannot_copy_insn_p (test_insn)))
898     can_assign = true;
899
900   /* Make sure test_insn doesn't have any pointers into GC space.  */
901   SET_SRC (PATTERN (test_insn)) = NULL_RTX;
902
903   return can_assign;
904 }
905
906 /* Return nonzero if the operands of expression X are unchanged from the
907    start of INSN's basic block up to but not including INSN (if AVAIL_P == 0),
908    or from INSN to the end of INSN's basic block (if AVAIL_P != 0).  */
909
910 static int
911 oprs_unchanged_p (const_rtx x, const rtx_insn *insn, int avail_p)
912 {
913   int i, j;
914   enum rtx_code code;
915   const char *fmt;
916
917   if (x == 0)
918     return 1;
919
920   code = GET_CODE (x);
921   switch (code)
922     {
923     case REG:
924       {
925         struct reg_avail_info *info = &reg_avail_info[REGNO (x)];
926
927         if (info->last_bb != current_bb)
928           return 1;
929         if (avail_p)
930           return info->last_set < DF_INSN_LUID (insn);
931         else
932           return info->first_set >= DF_INSN_LUID (insn);
933       }
934
935     case MEM:
936       if (! flag_gcse_lm
937           || load_killed_in_block_p (current_bb, DF_INSN_LUID (insn),
938                                      x, avail_p))
939         return 0;
940       else
941         return oprs_unchanged_p (XEXP (x, 0), insn, avail_p);
942
943     case PRE_DEC:
944     case PRE_INC:
945     case POST_DEC:
946     case POST_INC:
947     case PRE_MODIFY:
948     case POST_MODIFY:
949       return 0;
950
951     case PC:
952     case CC0: /*FIXME*/
953     case CONST:
954     CASE_CONST_ANY:
955     case SYMBOL_REF:
956     case LABEL_REF:
957     case ADDR_VEC:
958     case ADDR_DIFF_VEC:
959       return 1;
960
961     default:
962       break;
963     }
964
965   for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
966     {
967       if (fmt[i] == 'e')
968         {
969           /* If we are about to do the last recursive call needed at this
970              level, change it into iteration.  This function is called enough
971              to be worth it.  */
972           if (i == 0)
973             return oprs_unchanged_p (XEXP (x, i), insn, avail_p);
974
975           else if (! oprs_unchanged_p (XEXP (x, i), insn, avail_p))
976             return 0;
977         }
978       else if (fmt[i] == 'E')
979         for (j = 0; j < XVECLEN (x, i); j++)
980           if (! oprs_unchanged_p (XVECEXP (x, i, j), insn, avail_p))
981             return 0;
982     }
983
984   return 1;
985 }
986
987 /* Info passed from load_killed_in_block_p to mems_conflict_for_gcse_p.  */
988
989 struct mem_conflict_info
990 {
991   /* A memory reference for a load instruction, mems_conflict_for_gcse_p will
992      see if a memory store conflicts with this memory load.  */
993   const_rtx mem;
994
995   /* True if mems_conflict_for_gcse_p finds a conflict between two memory
996      references.  */
997   bool conflict;
998 };
999
1000 /* DEST is the output of an instruction.  If it is a memory reference and
1001    possibly conflicts with the load found in DATA, then communicate this
1002    information back through DATA.  */
1003
1004 static void
1005 mems_conflict_for_gcse_p (rtx dest, const_rtx setter ATTRIBUTE_UNUSED,
1006                           void *data)
1007 {
1008   struct mem_conflict_info *mci = (struct mem_conflict_info *) data;
1009
1010   while (GET_CODE (dest) == SUBREG
1011          || GET_CODE (dest) == ZERO_EXTRACT
1012          || GET_CODE (dest) == STRICT_LOW_PART)
1013     dest = XEXP (dest, 0);
1014
1015   /* If DEST is not a MEM, then it will not conflict with the load.  Note
1016      that function calls are assumed to clobber memory, but are handled
1017      elsewhere.  */
1018   if (! MEM_P (dest))
1019     return;
1020
1021   /* If we are setting a MEM in our list of specially recognized MEMs,
1022      don't mark as killed this time.  */
1023   if (pre_ldst_mems != NULL && expr_equiv_p (dest, mci->mem))
1024     {
1025       if (!find_rtx_in_ldst (dest))
1026         mci->conflict = true;
1027       return;
1028     }
1029
1030   if (true_dependence (dest, GET_MODE (dest), mci->mem))
1031     mci->conflict = true;
1032 }
1033
1034 /* Return nonzero if the expression in X (a memory reference) is killed
1035    in block BB before or after the insn with the LUID in UID_LIMIT.
1036    AVAIL_P is nonzero for kills after UID_LIMIT, and zero for kills
1037    before UID_LIMIT.
1038
1039    To check the entire block, set UID_LIMIT to max_uid + 1 and
1040    AVAIL_P to 0.  */
1041
1042 static int
1043 load_killed_in_block_p (const_basic_block bb, int uid_limit, const_rtx x,
1044                         int avail_p)
1045 {
1046   vec<rtx_insn *> list = modify_mem_list[bb->index];
1047   rtx_insn *setter;
1048   unsigned ix;
1049
1050   /* If this is a readonly then we aren't going to be changing it.  */
1051   if (MEM_READONLY_P (x))
1052     return 0;
1053
1054   FOR_EACH_VEC_ELT_REVERSE (list, ix, setter)
1055     {
1056       struct mem_conflict_info mci;
1057
1058       /* Ignore entries in the list that do not apply.  */
1059       if ((avail_p
1060            && DF_INSN_LUID (setter) < uid_limit)
1061           || (! avail_p
1062               && DF_INSN_LUID (setter) > uid_limit))
1063         continue;
1064
1065       /* If SETTER is a call everything is clobbered.  Note that calls
1066          to pure functions are never put on the list, so we need not
1067          worry about them.  */
1068       if (CALL_P (setter))
1069         return 1;
1070
1071       /* SETTER must be an INSN of some kind that sets memory.  Call
1072          note_stores to examine each hunk of memory that is modified.  */
1073       mci.mem = x;
1074       mci.conflict = false;
1075       note_stores (PATTERN (setter), mems_conflict_for_gcse_p, &mci);
1076       if (mci.conflict)
1077         return 1;
1078     }
1079   return 0;
1080 }
1081
1082 /* Return nonzero if the operands of expression X are unchanged from
1083    the start of INSN's basic block up to but not including INSN.  */
1084
1085 static int
1086 oprs_anticipatable_p (const_rtx x, const rtx_insn *insn)
1087 {
1088   return oprs_unchanged_p (x, insn, 0);
1089 }
1090
1091 /* Return nonzero if the operands of expression X are unchanged from
1092    INSN to the end of INSN's basic block.  */
1093
1094 static int
1095 oprs_available_p (const_rtx x, const rtx_insn *insn)
1096 {
1097   return oprs_unchanged_p (x, insn, 1);
1098 }
1099
1100 /* Hash expression X.
1101
1102    MODE is only used if X is a CONST_INT.  DO_NOT_RECORD_P is a boolean
1103    indicating if a volatile operand is found or if the expression contains
1104    something we don't want to insert in the table.  HASH_TABLE_SIZE is
1105    the current size of the hash table to be probed.  */
1106
1107 static unsigned int
1108 hash_expr (const_rtx x, machine_mode mode, int *do_not_record_p,
1109            int hash_table_size)
1110 {
1111   unsigned int hash;
1112
1113   *do_not_record_p = 0;
1114
1115   hash = hash_rtx (x, mode, do_not_record_p, NULL, /*have_reg_qty=*/false);
1116   return hash % hash_table_size;
1117 }
1118
1119 /* Return nonzero if exp1 is equivalent to exp2.  */
1120
1121 static int
1122 expr_equiv_p (const_rtx x, const_rtx y)
1123 {
1124   return exp_equiv_p (x, y, 0, true);
1125 }
1126
1127 /* Insert expression X in INSN in the hash TABLE.
1128    If it is already present, record it as the last occurrence in INSN's
1129    basic block.
1130
1131    MODE is the mode of the value X is being stored into.
1132    It is only used if X is a CONST_INT.
1133
1134    ANTIC_P is nonzero if X is an anticipatable expression.
1135    AVAIL_P is nonzero if X is an available expression.
1136
1137    MAX_DISTANCE is the maximum distance in instructions this expression can
1138    be moved.  */
1139
1140 static void
1141 insert_expr_in_table (rtx x, machine_mode mode, rtx_insn *insn,
1142                       int antic_p,
1143                       int avail_p, int max_distance, struct gcse_hash_table_d *table)
1144 {
1145   int found, do_not_record_p;
1146   unsigned int hash;
1147   struct gcse_expr *cur_expr, *last_expr = NULL;
1148   struct gcse_occr *antic_occr, *avail_occr;
1149
1150   hash = hash_expr (x, mode, &do_not_record_p, table->size);
1151
1152   /* Do not insert expression in table if it contains volatile operands,
1153      or if hash_expr determines the expression is something we don't want
1154      to or can't handle.  */
1155   if (do_not_record_p)
1156     return;
1157
1158   cur_expr = table->table[hash];
1159   found = 0;
1160
1161   while (cur_expr && 0 == (found = expr_equiv_p (cur_expr->expr, x)))
1162     {
1163       /* If the expression isn't found, save a pointer to the end of
1164          the list.  */
1165       last_expr = cur_expr;
1166       cur_expr = cur_expr->next_same_hash;
1167     }
1168
1169   if (! found)
1170     {
1171       cur_expr = GOBNEW (struct gcse_expr);
1172       bytes_used += sizeof (struct gcse_expr);
1173       if (table->table[hash] == NULL)
1174         /* This is the first pattern that hashed to this index.  */
1175         table->table[hash] = cur_expr;
1176       else
1177         /* Add EXPR to end of this hash chain.  */
1178         last_expr->next_same_hash = cur_expr;
1179
1180       /* Set the fields of the expr element.  */
1181       cur_expr->expr = x;
1182       cur_expr->bitmap_index = table->n_elems++;
1183       cur_expr->next_same_hash = NULL;
1184       cur_expr->antic_occr = NULL;
1185       cur_expr->avail_occr = NULL;
1186       gcc_assert (max_distance >= 0);
1187       cur_expr->max_distance = max_distance;
1188     }
1189   else
1190     gcc_assert (cur_expr->max_distance == max_distance);
1191
1192   /* Now record the occurrence(s).  */
1193   if (antic_p)
1194     {
1195       antic_occr = cur_expr->antic_occr;
1196
1197       if (antic_occr
1198           && BLOCK_FOR_INSN (antic_occr->insn) != BLOCK_FOR_INSN (insn))
1199         antic_occr = NULL;
1200
1201       if (antic_occr)
1202         /* Found another instance of the expression in the same basic block.
1203            Prefer the currently recorded one.  We want the first one in the
1204            block and the block is scanned from start to end.  */
1205         ; /* nothing to do */
1206       else
1207         {
1208           /* First occurrence of this expression in this basic block.  */
1209           antic_occr = GOBNEW (struct gcse_occr);
1210           bytes_used += sizeof (struct gcse_occr);
1211           antic_occr->insn = insn;
1212           antic_occr->next = cur_expr->antic_occr;
1213           antic_occr->deleted_p = 0;
1214           cur_expr->antic_occr = antic_occr;
1215         }
1216     }
1217
1218   if (avail_p)
1219     {
1220       avail_occr = cur_expr->avail_occr;
1221
1222       if (avail_occr
1223           && BLOCK_FOR_INSN (avail_occr->insn) == BLOCK_FOR_INSN (insn))
1224         {
1225           /* Found another instance of the expression in the same basic block.
1226              Prefer this occurrence to the currently recorded one.  We want
1227              the last one in the block and the block is scanned from start
1228              to end.  */
1229           avail_occr->insn = insn;
1230         }
1231       else
1232         {
1233           /* First occurrence of this expression in this basic block.  */
1234           avail_occr = GOBNEW (struct gcse_occr);
1235           bytes_used += sizeof (struct gcse_occr);
1236           avail_occr->insn = insn;
1237           avail_occr->next = cur_expr->avail_occr;
1238           avail_occr->deleted_p = 0;
1239           cur_expr->avail_occr = avail_occr;
1240         }
1241     }
1242 }
1243
1244 /* Scan SET present in INSN and add an entry to the hash TABLE.  */
1245
1246 static void
1247 hash_scan_set (rtx set, rtx_insn *insn, struct gcse_hash_table_d *table)
1248 {
1249   rtx src = SET_SRC (set);
1250   rtx dest = SET_DEST (set);
1251   rtx note;
1252
1253   if (GET_CODE (src) == CALL)
1254     hash_scan_call (src, insn, table);
1255
1256   else if (REG_P (dest))
1257     {
1258       unsigned int regno = REGNO (dest);
1259       int max_distance = 0;
1260
1261       /* See if a REG_EQUAL note shows this equivalent to a simpler expression.
1262
1263          This allows us to do a single GCSE pass and still eliminate
1264          redundant constants, addresses or other expressions that are
1265          constructed with multiple instructions.
1266
1267          However, keep the original SRC if INSN is a simple reg-reg move.
1268          In this case, there will almost always be a REG_EQUAL note on the
1269          insn that sets SRC.  By recording the REG_EQUAL value here as SRC
1270          for INSN, we miss copy propagation opportunities and we perform the
1271          same PRE GCSE operation repeatedly on the same REG_EQUAL value if we
1272          do more than one PRE GCSE pass.
1273
1274          Note that this does not impede profitable constant propagations.  We
1275          "look through" reg-reg sets in lookup_avail_set.  */
1276       note = find_reg_equal_equiv_note (insn);
1277       if (note != 0
1278           && REG_NOTE_KIND (note) == REG_EQUAL
1279           && !REG_P (src)
1280           && want_to_gcse_p (XEXP (note, 0), NULL))
1281         src = XEXP (note, 0), set = gen_rtx_SET (VOIDmode, dest, src);
1282
1283       /* Only record sets of pseudo-regs in the hash table.  */
1284       if (regno >= FIRST_PSEUDO_REGISTER
1285           /* Don't GCSE something if we can't do a reg/reg copy.  */
1286           && can_copy_p (GET_MODE (dest))
1287           /* GCSE commonly inserts instruction after the insn.  We can't
1288              do that easily for EH edges so disable GCSE on these for now.  */
1289           /* ??? We can now easily create new EH landing pads at the
1290              gimple level, for splitting edges; there's no reason we
1291              can't do the same thing at the rtl level.  */
1292           && !can_throw_internal (insn)
1293           /* Is SET_SRC something we want to gcse?  */
1294           && want_to_gcse_p (src, &max_distance)
1295           /* Don't CSE a nop.  */
1296           && ! set_noop_p (set)
1297           /* Don't GCSE if it has attached REG_EQUIV note.
1298              At this point this only function parameters should have
1299              REG_EQUIV notes and if the argument slot is used somewhere
1300              explicitly, it means address of parameter has been taken,
1301              so we should not extend the lifetime of the pseudo.  */
1302           && (note == NULL_RTX || ! MEM_P (XEXP (note, 0))))
1303         {
1304           /* An expression is not anticipatable if its operands are
1305              modified before this insn or if this is not the only SET in
1306              this insn.  The latter condition does not have to mean that
1307              SRC itself is not anticipatable, but we just will not be
1308              able to handle code motion of insns with multiple sets.  */
1309           int antic_p = oprs_anticipatable_p (src, insn)
1310                         && !multiple_sets (insn);
1311           /* An expression is not available if its operands are
1312              subsequently modified, including this insn.  It's also not
1313              available if this is a branch, because we can't insert
1314              a set after the branch.  */
1315           int avail_p = (oprs_available_p (src, insn)
1316                          && ! JUMP_P (insn));
1317
1318           insert_expr_in_table (src, GET_MODE (dest), insn, antic_p, avail_p,
1319                                 max_distance, table);
1320         }
1321     }
1322   /* In case of store we want to consider the memory value as available in
1323      the REG stored in that memory. This makes it possible to remove
1324      redundant loads from due to stores to the same location.  */
1325   else if (flag_gcse_las && REG_P (src) && MEM_P (dest))
1326       {
1327         unsigned int regno = REGNO (src);
1328         int max_distance = 0;
1329
1330         /* Only record sets of pseudo-regs in the hash table.  */
1331         if (regno >= FIRST_PSEUDO_REGISTER
1332            /* Don't GCSE something if we can't do a reg/reg copy.  */
1333            && can_copy_p (GET_MODE (src))
1334            /* GCSE commonly inserts instruction after the insn.  We can't
1335               do that easily for EH edges so disable GCSE on these for now.  */
1336            && !can_throw_internal (insn)
1337            /* Is SET_DEST something we want to gcse?  */
1338            && want_to_gcse_p (dest, &max_distance)
1339            /* Don't CSE a nop.  */
1340            && ! set_noop_p (set)
1341            /* Don't GCSE if it has attached REG_EQUIV note.
1342               At this point this only function parameters should have
1343               REG_EQUIV notes and if the argument slot is used somewhere
1344               explicitly, it means address of parameter has been taken,
1345               so we should not extend the lifetime of the pseudo.  */
1346            && ((note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) == 0
1347                || ! MEM_P (XEXP (note, 0))))
1348              {
1349                /* Stores are never anticipatable.  */
1350                int antic_p = 0;
1351                /* An expression is not available if its operands are
1352                   subsequently modified, including this insn.  It's also not
1353                   available if this is a branch, because we can't insert
1354                   a set after the branch.  */
1355                int avail_p = oprs_available_p (dest, insn)
1356                              && ! JUMP_P (insn);
1357
1358                /* Record the memory expression (DEST) in the hash table.  */
1359                insert_expr_in_table (dest, GET_MODE (dest), insn,
1360                                      antic_p, avail_p, max_distance, table);
1361              }
1362       }
1363 }
1364
1365 static void
1366 hash_scan_clobber (rtx x ATTRIBUTE_UNUSED, rtx_insn *insn ATTRIBUTE_UNUSED,
1367                    struct gcse_hash_table_d *table ATTRIBUTE_UNUSED)
1368 {
1369   /* Currently nothing to do.  */
1370 }
1371
1372 static void
1373 hash_scan_call (rtx x ATTRIBUTE_UNUSED, rtx_insn *insn ATTRIBUTE_UNUSED,
1374                 struct gcse_hash_table_d *table ATTRIBUTE_UNUSED)
1375 {
1376   /* Currently nothing to do.  */
1377 }
1378
1379 /* Process INSN and add hash table entries as appropriate.  */
1380
1381 static void
1382 hash_scan_insn (rtx_insn *insn, struct gcse_hash_table_d *table)
1383 {
1384   rtx pat = PATTERN (insn);
1385   int i;
1386
1387   /* Pick out the sets of INSN and for other forms of instructions record
1388      what's been modified.  */
1389
1390   if (GET_CODE (pat) == SET)
1391     hash_scan_set (pat, insn, table);
1392
1393   else if (GET_CODE (pat) == CLOBBER)
1394     hash_scan_clobber (pat, insn, table);
1395
1396   else if (GET_CODE (pat) == CALL)
1397     hash_scan_call (pat, insn, table);
1398
1399   else if (GET_CODE (pat) == PARALLEL)
1400     for (i = 0; i < XVECLEN (pat, 0); i++)
1401       {
1402         rtx x = XVECEXP (pat, 0, i);
1403
1404         if (GET_CODE (x) == SET)
1405           hash_scan_set (x, insn, table);
1406         else if (GET_CODE (x) == CLOBBER)
1407           hash_scan_clobber (x, insn, table);
1408         else if (GET_CODE (x) == CALL)
1409           hash_scan_call (x, insn, table);
1410       }
1411 }
1412
1413 /* Dump the hash table TABLE to file FILE under the name NAME.  */
1414
1415 static void
1416 dump_hash_table (FILE *file, const char *name, struct gcse_hash_table_d *table)
1417 {
1418   int i;
1419   /* Flattened out table, so it's printed in proper order.  */
1420   struct gcse_expr **flat_table;
1421   unsigned int *hash_val;
1422   struct gcse_expr *expr;
1423
1424   flat_table = XCNEWVEC (struct gcse_expr *, table->n_elems);
1425   hash_val = XNEWVEC (unsigned int, table->n_elems);
1426
1427   for (i = 0; i < (int) table->size; i++)
1428     for (expr = table->table[i]; expr != NULL; expr = expr->next_same_hash)
1429       {
1430         flat_table[expr->bitmap_index] = expr;
1431         hash_val[expr->bitmap_index] = i;
1432       }
1433
1434   fprintf (file, "%s hash table (%d buckets, %d entries)\n",
1435            name, table->size, table->n_elems);
1436
1437   for (i = 0; i < (int) table->n_elems; i++)
1438     if (flat_table[i] != 0)
1439       {
1440         expr = flat_table[i];
1441         fprintf (file, "Index %d (hash value %d; max distance %d)\n  ",
1442                  expr->bitmap_index, hash_val[i], expr->max_distance);
1443         print_rtl (file, expr->expr);
1444         fprintf (file, "\n");
1445       }
1446
1447   fprintf (file, "\n");
1448
1449   free (flat_table);
1450   free (hash_val);
1451 }
1452
1453 /* Record register first/last/block set information for REGNO in INSN.
1454
1455    first_set records the first place in the block where the register
1456    is set and is used to compute "anticipatability".
1457
1458    last_set records the last place in the block where the register
1459    is set and is used to compute "availability".
1460
1461    last_bb records the block for which first_set and last_set are
1462    valid, as a quick test to invalidate them.  */
1463
1464 static void
1465 record_last_reg_set_info (rtx insn, int regno)
1466 {
1467   struct reg_avail_info *info = &reg_avail_info[regno];
1468   int luid = DF_INSN_LUID (insn);
1469
1470   info->last_set = luid;
1471   if (info->last_bb != current_bb)
1472     {
1473       info->last_bb = current_bb;
1474       info->first_set = luid;
1475     }
1476 }
1477
1478 /* Record all of the canonicalized MEMs of record_last_mem_set_info's insn.
1479    Note we store a pair of elements in the list, so they have to be
1480    taken off pairwise.  */
1481
1482 static void
1483 canon_list_insert (rtx dest ATTRIBUTE_UNUSED, const_rtx x ATTRIBUTE_UNUSED,
1484                    void * v_insn)
1485 {
1486   rtx dest_addr, insn;
1487   int bb;
1488   modify_pair pair;
1489
1490   while (GET_CODE (dest) == SUBREG
1491       || GET_CODE (dest) == ZERO_EXTRACT
1492       || GET_CODE (dest) == STRICT_LOW_PART)
1493     dest = XEXP (dest, 0);
1494
1495   /* If DEST is not a MEM, then it will not conflict with a load.  Note
1496      that function calls are assumed to clobber memory, but are handled
1497      elsewhere.  */
1498
1499   if (! MEM_P (dest))
1500     return;
1501
1502   dest_addr = get_addr (XEXP (dest, 0));
1503   dest_addr = canon_rtx (dest_addr);
1504   insn = (rtx) v_insn;
1505   bb = BLOCK_FOR_INSN (insn)->index;
1506
1507   pair.dest = dest;
1508   pair.dest_addr = dest_addr;
1509   canon_modify_mem_list[bb].safe_push (pair);
1510 }
1511
1512 /* Record memory modification information for INSN.  We do not actually care
1513    about the memory location(s) that are set, or even how they are set (consider
1514    a CALL_INSN).  We merely need to record which insns modify memory.  */
1515
1516 static void
1517 record_last_mem_set_info (rtx_insn *insn)
1518 {
1519   int bb;
1520
1521   if (! flag_gcse_lm)
1522     return;
1523
1524   /* load_killed_in_block_p will handle the case of calls clobbering
1525      everything.  */
1526   bb = BLOCK_FOR_INSN (insn)->index;
1527   modify_mem_list[bb].safe_push (insn);
1528   bitmap_set_bit (modify_mem_list_set, bb);
1529
1530   if (CALL_P (insn))
1531     bitmap_set_bit (blocks_with_calls, bb);
1532   else
1533     note_stores (PATTERN (insn), canon_list_insert, (void*) insn);
1534 }
1535
1536 /* Called from compute_hash_table via note_stores to handle one
1537    SET or CLOBBER in an insn.  DATA is really the instruction in which
1538    the SET is taking place.  */
1539
1540 static void
1541 record_last_set_info (rtx dest, const_rtx setter ATTRIBUTE_UNUSED, void *data)
1542 {
1543   rtx_insn *last_set_insn = (rtx_insn *) data;
1544
1545   if (GET_CODE (dest) == SUBREG)
1546     dest = SUBREG_REG (dest);
1547
1548   if (REG_P (dest))
1549     record_last_reg_set_info (last_set_insn, REGNO (dest));
1550   else if (MEM_P (dest)
1551            /* Ignore pushes, they clobber nothing.  */
1552            && ! push_operand (dest, GET_MODE (dest)))
1553     record_last_mem_set_info (last_set_insn);
1554 }
1555
1556 /* Top level function to create an expression hash table.
1557
1558    Expression entries are placed in the hash table if
1559    - they are of the form (set (pseudo-reg) src),
1560    - src is something we want to perform GCSE on,
1561    - none of the operands are subsequently modified in the block
1562
1563    Currently src must be a pseudo-reg or a const_int.
1564
1565    TABLE is the table computed.  */
1566
1567 static void
1568 compute_hash_table_work (struct gcse_hash_table_d *table)
1569 {
1570   int i;
1571
1572   /* re-Cache any INSN_LIST nodes we have allocated.  */
1573   clear_modify_mem_tables ();
1574   /* Some working arrays used to track first and last set in each block.  */
1575   reg_avail_info = GNEWVEC (struct reg_avail_info, max_reg_num ());
1576
1577   for (i = 0; i < max_reg_num (); ++i)
1578     reg_avail_info[i].last_bb = NULL;
1579
1580   FOR_EACH_BB_FN (current_bb, cfun)
1581     {
1582       rtx_insn *insn;
1583       unsigned int regno;
1584
1585       /* First pass over the instructions records information used to
1586          determine when registers and memory are first and last set.  */
1587       FOR_BB_INSNS (current_bb, insn)
1588         {
1589           if (!NONDEBUG_INSN_P (insn))
1590             continue;
1591
1592           if (CALL_P (insn))
1593             {
1594               hard_reg_set_iterator hrsi;
1595               EXECUTE_IF_SET_IN_HARD_REG_SET (regs_invalidated_by_call,
1596                                               0, regno, hrsi)
1597                 record_last_reg_set_info (insn, regno);
1598
1599               if (! RTL_CONST_OR_PURE_CALL_P (insn))
1600                 record_last_mem_set_info (insn);
1601             }
1602
1603           note_stores (PATTERN (insn), record_last_set_info, insn);
1604         }
1605
1606       /* The next pass builds the hash table.  */
1607       FOR_BB_INSNS (current_bb, insn)
1608         if (NONDEBUG_INSN_P (insn))
1609           hash_scan_insn (insn, table);
1610     }
1611
1612   free (reg_avail_info);
1613   reg_avail_info = NULL;
1614 }
1615
1616 /* Allocate space for the set/expr hash TABLE.
1617    It is used to determine the number of buckets to use.  */
1618
1619 static void
1620 alloc_hash_table (struct gcse_hash_table_d *table)
1621 {
1622   int n;
1623
1624   n = get_max_insn_count ();
1625
1626   table->size = n / 4;
1627   if (table->size < 11)
1628     table->size = 11;
1629
1630   /* Attempt to maintain efficient use of hash table.
1631      Making it an odd number is simplest for now.
1632      ??? Later take some measurements.  */
1633   table->size |= 1;
1634   n = table->size * sizeof (struct gcse_expr *);
1635   table->table = GNEWVAR (struct gcse_expr *, n);
1636 }
1637
1638 /* Free things allocated by alloc_hash_table.  */
1639
1640 static void
1641 free_hash_table (struct gcse_hash_table_d *table)
1642 {
1643   free (table->table);
1644 }
1645
1646 /* Compute the expression hash table TABLE.  */
1647
1648 static void
1649 compute_hash_table (struct gcse_hash_table_d *table)
1650 {
1651   /* Initialize count of number of entries in hash table.  */
1652   table->n_elems = 0;
1653   memset (table->table, 0, table->size * sizeof (struct gcse_expr *));
1654
1655   compute_hash_table_work (table);
1656 }
1657 \f
1658 /* Expression tracking support.  */
1659
1660 /* Clear canon_modify_mem_list and modify_mem_list tables.  */
1661 static void
1662 clear_modify_mem_tables (void)
1663 {
1664   unsigned i;
1665   bitmap_iterator bi;
1666
1667   EXECUTE_IF_SET_IN_BITMAP (modify_mem_list_set, 0, i, bi)
1668     {
1669       modify_mem_list[i].release ();
1670       canon_modify_mem_list[i].release ();
1671     }
1672   bitmap_clear (modify_mem_list_set);
1673   bitmap_clear (blocks_with_calls);
1674 }
1675
1676 /* Release memory used by modify_mem_list_set.  */
1677
1678 static void
1679 free_modify_mem_tables (void)
1680 {
1681   clear_modify_mem_tables ();
1682   free (modify_mem_list);
1683   free (canon_modify_mem_list);
1684   modify_mem_list = 0;
1685   canon_modify_mem_list = 0;
1686 }
1687 \f
1688 /* For each block, compute whether X is transparent.  X is either an
1689    expression or an assignment [though we don't care which, for this context
1690    an assignment is treated as an expression].  For each block where an
1691    element of X is modified, reset the INDX bit in BMAP.  */
1692
1693 static void
1694 compute_transp (const_rtx x, int indx, sbitmap *bmap)
1695 {
1696   int i, j;
1697   enum rtx_code code;
1698   const char *fmt;
1699
1700   /* repeat is used to turn tail-recursion into iteration since GCC
1701      can't do it when there's no return value.  */
1702  repeat:
1703
1704   if (x == 0)
1705     return;
1706
1707   code = GET_CODE (x);
1708   switch (code)
1709     {
1710     case REG:
1711         {
1712           df_ref def;
1713           for (def = DF_REG_DEF_CHAIN (REGNO (x));
1714                def;
1715                def = DF_REF_NEXT_REG (def))
1716             bitmap_clear_bit (bmap[DF_REF_BB (def)->index], indx);
1717         }
1718
1719       return;
1720
1721     case MEM:
1722       if (! MEM_READONLY_P (x))
1723         {
1724           bitmap_iterator bi;
1725           unsigned bb_index;
1726           rtx x_addr;
1727
1728           x_addr = get_addr (XEXP (x, 0));
1729           x_addr = canon_rtx (x_addr);
1730
1731           /* First handle all the blocks with calls.  We don't need to
1732              do any list walking for them.  */
1733           EXECUTE_IF_SET_IN_BITMAP (blocks_with_calls, 0, bb_index, bi)
1734             {
1735               bitmap_clear_bit (bmap[bb_index], indx);
1736             }
1737
1738           /* Now iterate over the blocks which have memory modifications
1739              but which do not have any calls.  */
1740           EXECUTE_IF_AND_COMPL_IN_BITMAP (modify_mem_list_set,
1741                                           blocks_with_calls,
1742                                           0, bb_index, bi)
1743             {
1744               vec<modify_pair> list
1745                 = canon_modify_mem_list[bb_index];
1746               modify_pair *pair;
1747               unsigned ix;
1748
1749               FOR_EACH_VEC_ELT_REVERSE (list, ix, pair)
1750                 {
1751                   rtx dest = pair->dest;
1752                   rtx dest_addr = pair->dest_addr;
1753
1754                   if (canon_true_dependence (dest, GET_MODE (dest),
1755                                              dest_addr, x, x_addr))
1756                     {
1757                       bitmap_clear_bit (bmap[bb_index], indx);
1758                       break;
1759                     }
1760                 }
1761             }
1762         }
1763
1764       x = XEXP (x, 0);
1765       goto repeat;
1766
1767     case PC:
1768     case CC0: /*FIXME*/
1769     case CONST:
1770     CASE_CONST_ANY:
1771     case SYMBOL_REF:
1772     case LABEL_REF:
1773     case ADDR_VEC:
1774     case ADDR_DIFF_VEC:
1775       return;
1776
1777     default:
1778       break;
1779     }
1780
1781   for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
1782     {
1783       if (fmt[i] == 'e')
1784         {
1785           /* If we are about to do the last recursive call
1786              needed at this level, change it into iteration.
1787              This function is called enough to be worth it.  */
1788           if (i == 0)
1789             {
1790               x = XEXP (x, i);
1791               goto repeat;
1792             }
1793
1794           compute_transp (XEXP (x, i), indx, bmap);
1795         }
1796       else if (fmt[i] == 'E')
1797         for (j = 0; j < XVECLEN (x, i); j++)
1798           compute_transp (XVECEXP (x, i, j), indx, bmap);
1799     }
1800 }
1801 \f
1802 /* Compute PRE+LCM working variables.  */
1803
1804 /* Local properties of expressions.  */
1805
1806 /* Nonzero for expressions that are transparent in the block.  */
1807 static sbitmap *transp;
1808
1809 /* Nonzero for expressions that are computed (available) in the block.  */
1810 static sbitmap *comp;
1811
1812 /* Nonzero for expressions that are locally anticipatable in the block.  */
1813 static sbitmap *antloc;
1814
1815 /* Nonzero for expressions where this block is an optimal computation
1816    point.  */
1817 static sbitmap *pre_optimal;
1818
1819 /* Nonzero for expressions which are redundant in a particular block.  */
1820 static sbitmap *pre_redundant;
1821
1822 /* Nonzero for expressions which should be inserted on a specific edge.  */
1823 static sbitmap *pre_insert_map;
1824
1825 /* Nonzero for expressions which should be deleted in a specific block.  */
1826 static sbitmap *pre_delete_map;
1827
1828 /* Allocate vars used for PRE analysis.  */
1829
1830 static void
1831 alloc_pre_mem (int n_blocks, int n_exprs)
1832 {
1833   transp = sbitmap_vector_alloc (n_blocks, n_exprs);
1834   comp = sbitmap_vector_alloc (n_blocks, n_exprs);
1835   antloc = sbitmap_vector_alloc (n_blocks, n_exprs);
1836
1837   pre_optimal = NULL;
1838   pre_redundant = NULL;
1839   pre_insert_map = NULL;
1840   pre_delete_map = NULL;
1841   ae_kill = sbitmap_vector_alloc (n_blocks, n_exprs);
1842
1843   /* pre_insert and pre_delete are allocated later.  */
1844 }
1845
1846 /* Free vars used for PRE analysis.  */
1847
1848 static void
1849 free_pre_mem (void)
1850 {
1851   sbitmap_vector_free (transp);
1852   sbitmap_vector_free (comp);
1853
1854   /* ANTLOC and AE_KILL are freed just after pre_lcm finishes.  */
1855
1856   if (pre_optimal)
1857     sbitmap_vector_free (pre_optimal);
1858   if (pre_redundant)
1859     sbitmap_vector_free (pre_redundant);
1860   if (pre_insert_map)
1861     sbitmap_vector_free (pre_insert_map);
1862   if (pre_delete_map)
1863     sbitmap_vector_free (pre_delete_map);
1864
1865   transp = comp = NULL;
1866   pre_optimal = pre_redundant = pre_insert_map = pre_delete_map = NULL;
1867 }
1868
1869 /* Remove certain expressions from anticipatable and transparent
1870    sets of basic blocks that have incoming abnormal edge.
1871    For PRE remove potentially trapping expressions to avoid placing
1872    them on abnormal edges.  For hoisting remove memory references that
1873    can be clobbered by calls.  */
1874
1875 static void
1876 prune_expressions (bool pre_p)
1877 {
1878   sbitmap prune_exprs;
1879   struct gcse_expr *expr;
1880   unsigned int ui;
1881   basic_block bb;
1882
1883   prune_exprs = sbitmap_alloc (expr_hash_table.n_elems);
1884   bitmap_clear (prune_exprs);
1885   for (ui = 0; ui < expr_hash_table.size; ui++)
1886     {
1887       for (expr = expr_hash_table.table[ui]; expr; expr = expr->next_same_hash)
1888         {
1889           /* Note potentially trapping expressions.  */
1890           if (may_trap_p (expr->expr))
1891             {
1892               bitmap_set_bit (prune_exprs, expr->bitmap_index);
1893               continue;
1894             }
1895
1896           if (!pre_p && MEM_P (expr->expr))
1897             /* Note memory references that can be clobbered by a call.
1898                We do not split abnormal edges in hoisting, so would
1899                a memory reference get hoisted along an abnormal edge,
1900                it would be placed /before/ the call.  Therefore, only
1901                constant memory references can be hoisted along abnormal
1902                edges.  */
1903             {
1904               if (GET_CODE (XEXP (expr->expr, 0)) == SYMBOL_REF
1905                   && CONSTANT_POOL_ADDRESS_P (XEXP (expr->expr, 0)))
1906                 continue;
1907
1908               if (MEM_READONLY_P (expr->expr)
1909                   && !MEM_VOLATILE_P (expr->expr)
1910                   && MEM_NOTRAP_P (expr->expr))
1911                 /* Constant memory reference, e.g., a PIC address.  */
1912                 continue;
1913
1914               /* ??? Optimally, we would use interprocedural alias
1915                  analysis to determine if this mem is actually killed
1916                  by this call.  */
1917
1918               bitmap_set_bit (prune_exprs, expr->bitmap_index);
1919             }
1920         }
1921     }
1922
1923   FOR_EACH_BB_FN (bb, cfun)
1924     {
1925       edge e;
1926       edge_iterator ei;
1927
1928       /* If the current block is the destination of an abnormal edge, we
1929          kill all trapping (for PRE) and memory (for hoist) expressions
1930          because we won't be able to properly place the instruction on
1931          the edge.  So make them neither anticipatable nor transparent.
1932          This is fairly conservative.
1933
1934          ??? For hoisting it may be necessary to check for set-and-jump
1935          instructions here, not just for abnormal edges.  The general problem
1936          is that when an expression cannot not be placed right at the end of
1937          a basic block we should account for any side-effects of a subsequent
1938          jump instructions that could clobber the expression.  It would
1939          be best to implement this check along the lines of
1940          should_hoist_expr_to_dom where the target block is already known
1941          and, hence, there's no need to conservatively prune expressions on
1942          "intermediate" set-and-jump instructions.  */
1943       FOR_EACH_EDGE (e, ei, bb->preds)
1944         if ((e->flags & EDGE_ABNORMAL)
1945             && (pre_p || CALL_P (BB_END (e->src))))
1946           {
1947             bitmap_and_compl (antloc[bb->index],
1948                                 antloc[bb->index], prune_exprs);
1949             bitmap_and_compl (transp[bb->index],
1950                                 transp[bb->index], prune_exprs);
1951             break;
1952           }
1953     }
1954
1955   sbitmap_free (prune_exprs);
1956 }
1957
1958 /* It may be necessary to insert a large number of insns on edges to
1959    make the existing occurrences of expressions fully redundant.  This
1960    routine examines the set of insertions and deletions and if the ratio
1961    of insertions to deletions is too high for a particular expression, then
1962    the expression is removed from the insertion/deletion sets. 
1963
1964    N_ELEMS is the number of elements in the hash table.  */
1965
1966 static void
1967 prune_insertions_deletions (int n_elems)
1968 {
1969   sbitmap_iterator sbi;
1970   sbitmap prune_exprs;
1971
1972   /* We always use I to iterate over blocks/edges and J to iterate over
1973      expressions.  */
1974   unsigned int i, j;
1975
1976   /* Counts for the number of times an expression needs to be inserted and
1977      number of times an expression can be removed as a result.  */
1978   int *insertions = GCNEWVEC (int, n_elems);
1979   int *deletions = GCNEWVEC (int, n_elems);
1980
1981   /* Set of expressions which require too many insertions relative to
1982      the number of deletions achieved.  We will prune these out of the
1983      insertion/deletion sets.  */
1984   prune_exprs = sbitmap_alloc (n_elems);
1985   bitmap_clear (prune_exprs);
1986
1987   /* Iterate over the edges counting the number of times each expression
1988      needs to be inserted.  */
1989   for (i = 0; i < (unsigned) n_edges_for_fn (cfun); i++)
1990     {
1991       EXECUTE_IF_SET_IN_BITMAP (pre_insert_map[i], 0, j, sbi)
1992         insertions[j]++;
1993     }
1994
1995   /* Similarly for deletions, but those occur in blocks rather than on
1996      edges.  */
1997   for (i = 0; i < (unsigned) last_basic_block_for_fn (cfun); i++)
1998     {
1999       EXECUTE_IF_SET_IN_BITMAP (pre_delete_map[i], 0, j, sbi)
2000         deletions[j]++;
2001     }
2002
2003   /* Now that we have accurate counts, iterate over the elements in the
2004      hash table and see if any need too many insertions relative to the
2005      number of evaluations that can be removed.  If so, mark them in
2006      PRUNE_EXPRS.  */
2007   for (j = 0; j < (unsigned) n_elems; j++)
2008     if (deletions[j]
2009         && ((unsigned) insertions[j] / deletions[j]) > MAX_GCSE_INSERTION_RATIO)
2010       bitmap_set_bit (prune_exprs, j);
2011
2012   /* Now prune PRE_INSERT_MAP and PRE_DELETE_MAP based on PRUNE_EXPRS.  */
2013   EXECUTE_IF_SET_IN_BITMAP (prune_exprs, 0, j, sbi)
2014     {
2015       for (i = 0; i < (unsigned) n_edges_for_fn (cfun); i++)
2016         bitmap_clear_bit (pre_insert_map[i], j);
2017
2018       for (i = 0; i < (unsigned) last_basic_block_for_fn (cfun); i++)
2019         bitmap_clear_bit (pre_delete_map[i], j);
2020     }
2021
2022   sbitmap_free (prune_exprs);
2023   free (insertions);
2024   free (deletions);
2025 }
2026
2027 /* Top level routine to do the dataflow analysis needed by PRE.  */
2028
2029 static struct edge_list *
2030 compute_pre_data (void)
2031 {
2032   struct edge_list *edge_list;
2033   basic_block bb;
2034
2035   compute_local_properties (transp, comp, antloc, &expr_hash_table);
2036   prune_expressions (true);
2037   bitmap_vector_clear (ae_kill, last_basic_block_for_fn (cfun));
2038
2039   /* Compute ae_kill for each basic block using:
2040
2041      ~(TRANSP | COMP)
2042   */
2043
2044   FOR_EACH_BB_FN (bb, cfun)
2045     {
2046       bitmap_ior (ae_kill[bb->index], transp[bb->index], comp[bb->index]);
2047       bitmap_not (ae_kill[bb->index], ae_kill[bb->index]);
2048     }
2049
2050   edge_list = pre_edge_lcm (expr_hash_table.n_elems, transp, comp, antloc,
2051                             ae_kill, &pre_insert_map, &pre_delete_map);
2052   sbitmap_vector_free (antloc);
2053   antloc = NULL;
2054   sbitmap_vector_free (ae_kill);
2055   ae_kill = NULL;
2056
2057   prune_insertions_deletions (expr_hash_table.n_elems);
2058
2059   return edge_list;
2060 }
2061 \f
2062 /* PRE utilities */
2063
2064 /* Return nonzero if an occurrence of expression EXPR in OCCR_BB would reach
2065    block BB.
2066
2067    VISITED is a pointer to a working buffer for tracking which BB's have
2068    been visited.  It is NULL for the top-level call.
2069
2070    We treat reaching expressions that go through blocks containing the same
2071    reaching expression as "not reaching".  E.g. if EXPR is generated in blocks
2072    2 and 3, INSN is in block 4, and 2->3->4, we treat the expression in block
2073    2 as not reaching.  The intent is to improve the probability of finding
2074    only one reaching expression and to reduce register lifetimes by picking
2075    the closest such expression.  */
2076
2077 static int
2078 pre_expr_reaches_here_p_work (basic_block occr_bb, struct gcse_expr *expr,
2079                               basic_block bb, char *visited)
2080 {
2081   edge pred;
2082   edge_iterator ei;
2083
2084   FOR_EACH_EDGE (pred, ei, bb->preds)
2085     {
2086       basic_block pred_bb = pred->src;
2087
2088       if (pred->src == ENTRY_BLOCK_PTR_FOR_FN (cfun)
2089           /* Has predecessor has already been visited?  */
2090           || visited[pred_bb->index])
2091         ;/* Nothing to do.  */
2092
2093       /* Does this predecessor generate this expression?  */
2094       else if (bitmap_bit_p (comp[pred_bb->index], expr->bitmap_index))
2095         {
2096           /* Is this the occurrence we're looking for?
2097              Note that there's only one generating occurrence per block
2098              so we just need to check the block number.  */
2099           if (occr_bb == pred_bb)
2100             return 1;
2101
2102           visited[pred_bb->index] = 1;
2103         }
2104       /* Ignore this predecessor if it kills the expression.  */
2105       else if (! bitmap_bit_p (transp[pred_bb->index], expr->bitmap_index))
2106         visited[pred_bb->index] = 1;
2107
2108       /* Neither gen nor kill.  */
2109       else
2110         {
2111           visited[pred_bb->index] = 1;
2112           if (pre_expr_reaches_here_p_work (occr_bb, expr, pred_bb, visited))
2113             return 1;
2114         }
2115     }
2116
2117   /* All paths have been checked.  */
2118   return 0;
2119 }
2120
2121 /* The wrapper for pre_expr_reaches_here_work that ensures that any
2122    memory allocated for that function is returned.  */
2123
2124 static int
2125 pre_expr_reaches_here_p (basic_block occr_bb, struct gcse_expr *expr, basic_block bb)
2126 {
2127   int rval;
2128   char *visited = XCNEWVEC (char, last_basic_block_for_fn (cfun));
2129
2130   rval = pre_expr_reaches_here_p_work (occr_bb, expr, bb, visited);
2131
2132   free (visited);
2133   return rval;
2134 }
2135 \f
2136 /* Generate RTL to copy an EXPR to its `reaching_reg' and return it.  */
2137
2138 static rtx_insn *
2139 process_insert_insn (struct gcse_expr *expr)
2140 {
2141   rtx reg = expr->reaching_reg;
2142   /* Copy the expression to make sure we don't have any sharing issues.  */
2143   rtx exp = copy_rtx (expr->expr);
2144   rtx_insn *pat;
2145
2146   start_sequence ();
2147
2148   /* If the expression is something that's an operand, like a constant,
2149      just copy it to a register.  */
2150   if (general_operand (exp, GET_MODE (reg)))
2151     emit_move_insn (reg, exp);
2152
2153   /* Otherwise, make a new insn to compute this expression and make sure the
2154      insn will be recognized (this also adds any needed CLOBBERs).  */
2155   else
2156     {
2157       rtx_insn *insn = emit_insn (gen_rtx_SET (VOIDmode, reg, exp));
2158
2159       if (insn_invalid_p (insn, false))
2160         gcc_unreachable ();
2161     }
2162
2163   pat = get_insns ();
2164   end_sequence ();
2165
2166   return pat;
2167 }
2168
2169 /* Add EXPR to the end of basic block BB.
2170
2171    This is used by both the PRE and code hoisting.  */
2172
2173 static void
2174 insert_insn_end_basic_block (struct gcse_expr *expr, basic_block bb)
2175 {
2176   rtx_insn *insn = BB_END (bb);
2177   rtx_insn *new_insn;
2178   rtx reg = expr->reaching_reg;
2179   int regno = REGNO (reg);
2180   rtx_insn *pat, *pat_end;
2181
2182   pat = process_insert_insn (expr);
2183   gcc_assert (pat && INSN_P (pat));
2184
2185   pat_end = pat;
2186   while (NEXT_INSN (pat_end) != NULL_RTX)
2187     pat_end = NEXT_INSN (pat_end);
2188
2189   /* If the last insn is a jump, insert EXPR in front [taking care to
2190      handle cc0, etc. properly].  Similarly we need to care trapping
2191      instructions in presence of non-call exceptions.  */
2192
2193   if (JUMP_P (insn)
2194       || (NONJUMP_INSN_P (insn)
2195           && (!single_succ_p (bb)
2196               || single_succ_edge (bb)->flags & EDGE_ABNORMAL)))
2197     {
2198 #ifdef HAVE_cc0
2199       /* FIXME: 'twould be nice to call prev_cc0_setter here but it aborts
2200          if cc0 isn't set.  */
2201       rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
2202       if (note)
2203         insn = safe_as_a <rtx_insn *> (XEXP (note, 0));
2204       else
2205         {
2206           rtx_insn *maybe_cc0_setter = prev_nonnote_insn (insn);
2207           if (maybe_cc0_setter
2208               && INSN_P (maybe_cc0_setter)
2209               && sets_cc0_p (PATTERN (maybe_cc0_setter)))
2210             insn = maybe_cc0_setter;
2211         }
2212 #endif
2213       /* FIXME: What if something in cc0/jump uses value set in new insn?  */
2214       new_insn = emit_insn_before_noloc (pat, insn, bb);
2215     }
2216
2217   /* Likewise if the last insn is a call, as will happen in the presence
2218      of exception handling.  */
2219   else if (CALL_P (insn)
2220            && (!single_succ_p (bb)
2221                || single_succ_edge (bb)->flags & EDGE_ABNORMAL))
2222     {
2223       /* Keeping in mind targets with small register classes and parameters
2224          in registers, we search backward and place the instructions before
2225          the first parameter is loaded.  Do this for everyone for consistency
2226          and a presumption that we'll get better code elsewhere as well.  */
2227
2228       /* Since different machines initialize their parameter registers
2229          in different orders, assume nothing.  Collect the set of all
2230          parameter registers.  */
2231       insn = find_first_parameter_load (insn, BB_HEAD (bb));
2232
2233       /* If we found all the parameter loads, then we want to insert
2234          before the first parameter load.
2235
2236          If we did not find all the parameter loads, then we might have
2237          stopped on the head of the block, which could be a CODE_LABEL.
2238          If we inserted before the CODE_LABEL, then we would be putting
2239          the insn in the wrong basic block.  In that case, put the insn
2240          after the CODE_LABEL.  Also, respect NOTE_INSN_BASIC_BLOCK.  */
2241       while (LABEL_P (insn)
2242              || NOTE_INSN_BASIC_BLOCK_P (insn))
2243         insn = NEXT_INSN (insn);
2244
2245       new_insn = emit_insn_before_noloc (pat, insn, bb);
2246     }
2247   else
2248     new_insn = emit_insn_after_noloc (pat, insn, bb);
2249
2250   while (1)
2251     {
2252       if (INSN_P (pat))
2253         add_label_notes (PATTERN (pat), new_insn);
2254       if (pat == pat_end)
2255         break;
2256       pat = NEXT_INSN (pat);
2257     }
2258
2259   gcse_create_count++;
2260
2261   if (dump_file)
2262     {
2263       fprintf (dump_file, "PRE/HOIST: end of bb %d, insn %d, ",
2264                bb->index, INSN_UID (new_insn));
2265       fprintf (dump_file, "copying expression %d to reg %d\n",
2266                expr->bitmap_index, regno);
2267     }
2268 }
2269
2270 /* Insert partially redundant expressions on edges in the CFG to make
2271    the expressions fully redundant.  */
2272
2273 static int
2274 pre_edge_insert (struct edge_list *edge_list, struct gcse_expr **index_map)
2275 {
2276   int e, i, j, num_edges, set_size, did_insert = 0;
2277   sbitmap *inserted;
2278
2279   /* Where PRE_INSERT_MAP is nonzero, we add the expression on that edge
2280      if it reaches any of the deleted expressions.  */
2281
2282   set_size = pre_insert_map[0]->size;
2283   num_edges = NUM_EDGES (edge_list);
2284   inserted = sbitmap_vector_alloc (num_edges, expr_hash_table.n_elems);
2285   bitmap_vector_clear (inserted, num_edges);
2286
2287   for (e = 0; e < num_edges; e++)
2288     {
2289       int indx;
2290       basic_block bb = INDEX_EDGE_PRED_BB (edge_list, e);
2291
2292       for (i = indx = 0; i < set_size; i++, indx += SBITMAP_ELT_BITS)
2293         {
2294           SBITMAP_ELT_TYPE insert = pre_insert_map[e]->elms[i];
2295
2296           for (j = indx;
2297                insert && j < (int) expr_hash_table.n_elems;
2298                j++, insert >>= 1)
2299             if ((insert & 1) != 0 && index_map[j]->reaching_reg != NULL_RTX)
2300               {
2301                 struct gcse_expr *expr = index_map[j];
2302                 struct gcse_occr *occr;
2303
2304                 /* Now look at each deleted occurrence of this expression.  */
2305                 for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
2306                   {
2307                     if (! occr->deleted_p)
2308                       continue;
2309
2310                     /* Insert this expression on this edge if it would
2311                        reach the deleted occurrence in BB.  */
2312                     if (!bitmap_bit_p (inserted[e], j))
2313                       {
2314                         rtx_insn *insn;
2315                         edge eg = INDEX_EDGE (edge_list, e);
2316
2317                         /* We can't insert anything on an abnormal and
2318                            critical edge, so we insert the insn at the end of
2319                            the previous block. There are several alternatives
2320                            detailed in Morgans book P277 (sec 10.5) for
2321                            handling this situation.  This one is easiest for
2322                            now.  */
2323
2324                         if (eg->flags & EDGE_ABNORMAL)
2325                           insert_insn_end_basic_block (index_map[j], bb);
2326                         else
2327                           {
2328                             insn = process_insert_insn (index_map[j]);
2329                             insert_insn_on_edge (insn, eg);
2330                           }
2331
2332                         if (dump_file)
2333                           {
2334                             fprintf (dump_file, "PRE: edge (%d,%d), ",
2335                                      bb->index,
2336                                      INDEX_EDGE_SUCC_BB (edge_list, e)->index);
2337                             fprintf (dump_file, "copy expression %d\n",
2338                                      expr->bitmap_index);
2339                           }
2340
2341                         update_ld_motion_stores (expr);
2342                         bitmap_set_bit (inserted[e], j);
2343                         did_insert = 1;
2344                         gcse_create_count++;
2345                       }
2346                   }
2347               }
2348         }
2349     }
2350
2351   sbitmap_vector_free (inserted);
2352   return did_insert;
2353 }
2354
2355 /* Copy the result of EXPR->EXPR generated by INSN to EXPR->REACHING_REG.
2356    Given "old_reg <- expr" (INSN), instead of adding after it
2357      reaching_reg <- old_reg
2358    it's better to do the following:
2359      reaching_reg <- expr
2360      old_reg      <- reaching_reg
2361    because this way copy propagation can discover additional PRE
2362    opportunities.  But if this fails, we try the old way.
2363    When "expr" is a store, i.e.
2364    given "MEM <- old_reg", instead of adding after it
2365      reaching_reg <- old_reg
2366    it's better to add it before as follows:
2367      reaching_reg <- old_reg
2368      MEM          <- reaching_reg.  */
2369
2370 static void
2371 pre_insert_copy_insn (struct gcse_expr *expr, rtx_insn *insn)
2372 {
2373   rtx reg = expr->reaching_reg;
2374   int regno = REGNO (reg);
2375   int indx = expr->bitmap_index;
2376   rtx pat = PATTERN (insn);
2377   rtx set, first_set, new_insn;
2378   rtx old_reg;
2379   int i;
2380
2381   /* This block matches the logic in hash_scan_insn.  */
2382   switch (GET_CODE (pat))
2383     {
2384     case SET:
2385       set = pat;
2386       break;
2387
2388     case PARALLEL:
2389       /* Search through the parallel looking for the set whose
2390          source was the expression that we're interested in.  */
2391       first_set = NULL_RTX;
2392       set = NULL_RTX;
2393       for (i = 0; i < XVECLEN (pat, 0); i++)
2394         {
2395           rtx x = XVECEXP (pat, 0, i);
2396           if (GET_CODE (x) == SET)
2397             {
2398               /* If the source was a REG_EQUAL or REG_EQUIV note, we
2399                  may not find an equivalent expression, but in this
2400                  case the PARALLEL will have a single set.  */
2401               if (first_set == NULL_RTX)
2402                 first_set = x;
2403               if (expr_equiv_p (SET_SRC (x), expr->expr))
2404                 {
2405                   set = x;
2406                   break;
2407                 }
2408             }
2409         }
2410
2411       gcc_assert (first_set);
2412       if (set == NULL_RTX)
2413         set = first_set;
2414       break;
2415
2416     default:
2417       gcc_unreachable ();
2418     }
2419
2420   if (REG_P (SET_DEST (set)))
2421     {
2422       old_reg = SET_DEST (set);
2423       /* Check if we can modify the set destination in the original insn.  */
2424       if (validate_change (insn, &SET_DEST (set), reg, 0))
2425         {
2426           new_insn = gen_move_insn (old_reg, reg);
2427           new_insn = emit_insn_after (new_insn, insn);
2428         }
2429       else
2430         {
2431           new_insn = gen_move_insn (reg, old_reg);
2432           new_insn = emit_insn_after (new_insn, insn);
2433         }
2434     }
2435   else /* This is possible only in case of a store to memory.  */
2436     {
2437       old_reg = SET_SRC (set);
2438       new_insn = gen_move_insn (reg, old_reg);
2439
2440       /* Check if we can modify the set source in the original insn.  */
2441       if (validate_change (insn, &SET_SRC (set), reg, 0))
2442         new_insn = emit_insn_before (new_insn, insn);
2443       else
2444         new_insn = emit_insn_after (new_insn, insn);
2445     }
2446
2447   gcse_create_count++;
2448
2449   if (dump_file)
2450     fprintf (dump_file,
2451              "PRE: bb %d, insn %d, copy expression %d in insn %d to reg %d\n",
2452               BLOCK_FOR_INSN (insn)->index, INSN_UID (new_insn), indx,
2453               INSN_UID (insn), regno);
2454 }
2455
2456 /* Copy available expressions that reach the redundant expression
2457    to `reaching_reg'.  */
2458
2459 static void
2460 pre_insert_copies (void)
2461 {
2462   unsigned int i, added_copy;
2463   struct gcse_expr *expr;
2464   struct gcse_occr *occr;
2465   struct gcse_occr *avail;
2466
2467   /* For each available expression in the table, copy the result to
2468      `reaching_reg' if the expression reaches a deleted one.
2469
2470      ??? The current algorithm is rather brute force.
2471      Need to do some profiling.  */
2472
2473   for (i = 0; i < expr_hash_table.size; i++)
2474     for (expr = expr_hash_table.table[i]; expr; expr = expr->next_same_hash)
2475       {
2476         /* If the basic block isn't reachable, PPOUT will be TRUE.  However,
2477            we don't want to insert a copy here because the expression may not
2478            really be redundant.  So only insert an insn if the expression was
2479            deleted.  This test also avoids further processing if the
2480            expression wasn't deleted anywhere.  */
2481         if (expr->reaching_reg == NULL)
2482           continue;
2483
2484         /* Set when we add a copy for that expression.  */
2485         added_copy = 0;
2486
2487         for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
2488           {
2489             if (! occr->deleted_p)
2490               continue;
2491
2492             for (avail = expr->avail_occr; avail != NULL; avail = avail->next)
2493               {
2494                 rtx_insn *insn = avail->insn;
2495
2496                 /* No need to handle this one if handled already.  */
2497                 if (avail->copied_p)
2498                   continue;
2499
2500                 /* Don't handle this one if it's a redundant one.  */
2501                 if (insn->deleted ())
2502                   continue;
2503
2504                 /* Or if the expression doesn't reach the deleted one.  */
2505                 if (! pre_expr_reaches_here_p (BLOCK_FOR_INSN (avail->insn),
2506                                                expr,
2507                                                BLOCK_FOR_INSN (occr->insn)))
2508                   continue;
2509
2510                 added_copy = 1;
2511
2512                 /* Copy the result of avail to reaching_reg.  */
2513                 pre_insert_copy_insn (expr, insn);
2514                 avail->copied_p = 1;
2515               }
2516           }
2517
2518           if (added_copy)
2519             update_ld_motion_stores (expr);
2520       }
2521 }
2522
2523 struct set_data
2524 {
2525   rtx_insn *insn;
2526   const_rtx set;
2527   int nsets;
2528 };
2529
2530 /* Increment number of sets and record set in DATA.  */
2531
2532 static void
2533 record_set_data (rtx dest, const_rtx set, void *data)
2534 {
2535   struct set_data *s = (struct set_data *)data;
2536
2537   if (GET_CODE (set) == SET)
2538     {
2539       /* We allow insns having multiple sets, where all but one are
2540          dead as single set insns.  In the common case only a single
2541          set is present, so we want to avoid checking for REG_UNUSED
2542          notes unless necessary.  */
2543       if (s->nsets == 1
2544           && find_reg_note (s->insn, REG_UNUSED, SET_DEST (s->set))
2545           && !side_effects_p (s->set))
2546         s->nsets = 0;
2547
2548       if (!s->nsets)
2549         {
2550           /* Record this set.  */
2551           s->nsets += 1;
2552           s->set = set;
2553         }
2554       else if (!find_reg_note (s->insn, REG_UNUSED, dest)
2555                || side_effects_p (set))
2556         s->nsets += 1;
2557     }
2558 }
2559
2560 static const_rtx
2561 single_set_gcse (rtx_insn *insn)
2562 {
2563   struct set_data s;
2564   rtx pattern;
2565   
2566   gcc_assert (INSN_P (insn));
2567
2568   /* Optimize common case.  */
2569   pattern = PATTERN (insn);
2570   if (GET_CODE (pattern) == SET)
2571     return pattern;
2572
2573   s.insn = insn;
2574   s.nsets = 0;
2575   note_stores (pattern, record_set_data, &s);
2576
2577   /* Considered invariant insns have exactly one set.  */
2578   gcc_assert (s.nsets == 1);
2579   return s.set;
2580 }
2581
2582 /* Emit move from SRC to DEST noting the equivalence with expression computed
2583    in INSN.  */
2584
2585 static rtx
2586 gcse_emit_move_after (rtx dest, rtx src, rtx_insn *insn)
2587 {
2588   rtx_insn *new_rtx;
2589   const_rtx set = single_set_gcse (insn);
2590   rtx set2;
2591   rtx note;
2592   rtx eqv = NULL_RTX;
2593
2594   /* This should never fail since we're creating a reg->reg copy
2595      we've verified to be valid.  */
2596
2597   new_rtx = emit_insn_after (gen_move_insn (dest, src), insn);
2598
2599   /* Note the equivalence for local CSE pass.  Take the note from the old
2600      set if there was one.  Otherwise record the SET_SRC from the old set
2601      unless DEST is also an operand of the SET_SRC.  */
2602   set2 = single_set (new_rtx);
2603   if (!set2 || !rtx_equal_p (SET_DEST (set2), dest))
2604     return new_rtx;
2605   if ((note = find_reg_equal_equiv_note (insn)))
2606     eqv = XEXP (note, 0);
2607   else if (! REG_P (dest)
2608            || ! reg_mentioned_p (dest, SET_SRC (set)))
2609     eqv = SET_SRC (set);
2610
2611   if (eqv != NULL_RTX)
2612     set_unique_reg_note (new_rtx, REG_EQUAL, copy_insn_1 (eqv));
2613
2614   return new_rtx;
2615 }
2616
2617 /* Delete redundant computations.
2618    Deletion is done by changing the insn to copy the `reaching_reg' of
2619    the expression into the result of the SET.  It is left to later passes
2620    to propagate the copy or eliminate it.
2621
2622    Return nonzero if a change is made.  */
2623
2624 static int
2625 pre_delete (void)
2626 {
2627   unsigned int i;
2628   int changed;
2629   struct gcse_expr *expr;
2630   struct gcse_occr *occr;
2631
2632   changed = 0;
2633   for (i = 0; i < expr_hash_table.size; i++)
2634     for (expr = expr_hash_table.table[i]; expr; expr = expr->next_same_hash)
2635       {
2636         int indx = expr->bitmap_index;
2637
2638         /* We only need to search antic_occr since we require ANTLOC != 0.  */
2639         for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
2640           {
2641             rtx_insn *insn = occr->insn;
2642             rtx set;
2643             basic_block bb = BLOCK_FOR_INSN (insn);
2644
2645             /* We only delete insns that have a single_set.  */
2646             if (bitmap_bit_p (pre_delete_map[bb->index], indx)
2647                 && (set = single_set (insn)) != 0
2648                 && dbg_cnt (pre_insn))
2649               {
2650                 /* Create a pseudo-reg to store the result of reaching
2651                    expressions into.  Get the mode for the new pseudo from
2652                    the mode of the original destination pseudo.  */
2653                 if (expr->reaching_reg == NULL)
2654                   expr->reaching_reg = gen_reg_rtx_and_attrs (SET_DEST (set));
2655
2656                 gcse_emit_move_after (SET_DEST (set), expr->reaching_reg, insn);
2657                 delete_insn (insn);
2658                 occr->deleted_p = 1;
2659                 changed = 1;
2660                 gcse_subst_count++;
2661
2662                 if (dump_file)
2663                   {
2664                     fprintf (dump_file,
2665                              "PRE: redundant insn %d (expression %d) in ",
2666                                INSN_UID (insn), indx);
2667                     fprintf (dump_file, "bb %d, reaching reg is %d\n",
2668                              bb->index, REGNO (expr->reaching_reg));
2669                   }
2670               }
2671           }
2672       }
2673
2674   return changed;
2675 }
2676
2677 /* Perform GCSE optimizations using PRE.
2678    This is called by one_pre_gcse_pass after all the dataflow analysis
2679    has been done.
2680
2681    This is based on the original Morel-Renvoise paper Fred Chow's thesis, and
2682    lazy code motion from Knoop, Ruthing and Steffen as described in Advanced
2683    Compiler Design and Implementation.
2684
2685    ??? A new pseudo reg is created to hold the reaching expression.  The nice
2686    thing about the classical approach is that it would try to use an existing
2687    reg.  If the register can't be adequately optimized [i.e. we introduce
2688    reload problems], one could add a pass here to propagate the new register
2689    through the block.
2690
2691    ??? We don't handle single sets in PARALLELs because we're [currently] not
2692    able to copy the rest of the parallel when we insert copies to create full
2693    redundancies from partial redundancies.  However, there's no reason why we
2694    can't handle PARALLELs in the cases where there are no partial
2695    redundancies.  */
2696
2697 static int
2698 pre_gcse (struct edge_list *edge_list)
2699 {
2700   unsigned int i;
2701   int did_insert, changed;
2702   struct gcse_expr **index_map;
2703   struct gcse_expr *expr;
2704
2705   /* Compute a mapping from expression number (`bitmap_index') to
2706      hash table entry.  */
2707
2708   index_map = XCNEWVEC (struct gcse_expr *, expr_hash_table.n_elems);
2709   for (i = 0; i < expr_hash_table.size; i++)
2710     for (expr = expr_hash_table.table[i]; expr; expr = expr->next_same_hash)
2711       index_map[expr->bitmap_index] = expr;
2712
2713   /* Delete the redundant insns first so that
2714      - we know what register to use for the new insns and for the other
2715        ones with reaching expressions
2716      - we know which insns are redundant when we go to create copies  */
2717
2718   changed = pre_delete ();
2719   did_insert = pre_edge_insert (edge_list, index_map);
2720
2721   /* In other places with reaching expressions, copy the expression to the
2722      specially allocated pseudo-reg that reaches the redundant expr.  */
2723   pre_insert_copies ();
2724   if (did_insert)
2725     {
2726       commit_edge_insertions ();
2727       changed = 1;
2728     }
2729
2730   free (index_map);
2731   return changed;
2732 }
2733
2734 /* Top level routine to perform one PRE GCSE pass.
2735
2736    Return nonzero if a change was made.  */
2737
2738 static int
2739 one_pre_gcse_pass (void)
2740 {
2741   int changed = 0;
2742
2743   gcse_subst_count = 0;
2744   gcse_create_count = 0;
2745
2746   /* Return if there's nothing to do, or it is too expensive.  */
2747   if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1
2748       || is_too_expensive (_("PRE disabled")))
2749     return 0;
2750
2751   /* We need alias.  */
2752   init_alias_analysis ();
2753
2754   bytes_used = 0;
2755   gcc_obstack_init (&gcse_obstack);
2756   alloc_gcse_mem ();
2757
2758   alloc_hash_table (&expr_hash_table);
2759   add_noreturn_fake_exit_edges ();
2760   if (flag_gcse_lm)
2761     compute_ld_motion_mems ();
2762
2763   compute_hash_table (&expr_hash_table);
2764   if (flag_gcse_lm)
2765     trim_ld_motion_mems ();
2766   if (dump_file)
2767     dump_hash_table (dump_file, "Expression", &expr_hash_table);
2768
2769   if (expr_hash_table.n_elems > 0)
2770     {
2771       struct edge_list *edge_list;
2772       alloc_pre_mem (last_basic_block_for_fn (cfun), expr_hash_table.n_elems);
2773       edge_list = compute_pre_data ();
2774       changed |= pre_gcse (edge_list);
2775       free_edge_list (edge_list);
2776       free_pre_mem ();
2777     }
2778
2779   if (flag_gcse_lm)
2780     free_ld_motion_mems ();
2781   remove_fake_exit_edges ();
2782   free_hash_table (&expr_hash_table);
2783
2784   free_gcse_mem ();
2785   obstack_free (&gcse_obstack, NULL);
2786
2787   /* We are finished with alias.  */
2788   end_alias_analysis ();
2789
2790   if (dump_file)
2791     {
2792       fprintf (dump_file, "PRE GCSE of %s, %d basic blocks, %d bytes needed, ",
2793                current_function_name (), n_basic_blocks_for_fn (cfun),
2794                bytes_used);
2795       fprintf (dump_file, "%d substs, %d insns created\n",
2796                gcse_subst_count, gcse_create_count);
2797     }
2798
2799   return changed;
2800 }
2801 \f
2802 /* If X contains any LABEL_REF's, add REG_LABEL_OPERAND notes for them
2803    to INSN.  If such notes are added to an insn which references a
2804    CODE_LABEL, the LABEL_NUSES count is incremented.  We have to add
2805    that note, because the following loop optimization pass requires
2806    them.  */
2807
2808 /* ??? If there was a jump optimization pass after gcse and before loop,
2809    then we would not need to do this here, because jump would add the
2810    necessary REG_LABEL_OPERAND and REG_LABEL_TARGET notes.  */
2811
2812 static void
2813 add_label_notes (rtx x, rtx insn)
2814 {
2815   enum rtx_code code = GET_CODE (x);
2816   int i, j;
2817   const char *fmt;
2818
2819   if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
2820     {
2821       /* This code used to ignore labels that referred to dispatch tables to
2822          avoid flow generating (slightly) worse code.
2823
2824          We no longer ignore such label references (see LABEL_REF handling in
2825          mark_jump_label for additional information).  */
2826
2827       /* There's no reason for current users to emit jump-insns with
2828          such a LABEL_REF, so we don't have to handle REG_LABEL_TARGET
2829          notes.  */
2830       gcc_assert (!JUMP_P (insn));
2831       add_reg_note (insn, REG_LABEL_OPERAND, LABEL_REF_LABEL (x));
2832
2833       if (LABEL_P (LABEL_REF_LABEL (x)))
2834         LABEL_NUSES (LABEL_REF_LABEL (x))++;
2835
2836       return;
2837     }
2838
2839   for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
2840     {
2841       if (fmt[i] == 'e')
2842         add_label_notes (XEXP (x, i), insn);
2843       else if (fmt[i] == 'E')
2844         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2845           add_label_notes (XVECEXP (x, i, j), insn);
2846     }
2847 }
2848
2849 /* Code Hoisting variables and subroutines.  */
2850
2851 /* Very busy expressions.  */
2852 static sbitmap *hoist_vbein;
2853 static sbitmap *hoist_vbeout;
2854
2855 /* ??? We could compute post dominators and run this algorithm in
2856    reverse to perform tail merging, doing so would probably be
2857    more effective than the tail merging code in jump.c.
2858
2859    It's unclear if tail merging could be run in parallel with
2860    code hoisting.  It would be nice.  */
2861
2862 /* Allocate vars used for code hoisting analysis.  */
2863
2864 static void
2865 alloc_code_hoist_mem (int n_blocks, int n_exprs)
2866 {
2867   antloc = sbitmap_vector_alloc (n_blocks, n_exprs);
2868   transp = sbitmap_vector_alloc (n_blocks, n_exprs);
2869   comp = sbitmap_vector_alloc (n_blocks, n_exprs);
2870
2871   hoist_vbein = sbitmap_vector_alloc (n_blocks, n_exprs);
2872   hoist_vbeout = sbitmap_vector_alloc (n_blocks, n_exprs);
2873 }
2874
2875 /* Free vars used for code hoisting analysis.  */
2876
2877 static void
2878 free_code_hoist_mem (void)
2879 {
2880   sbitmap_vector_free (antloc);
2881   sbitmap_vector_free (transp);
2882   sbitmap_vector_free (comp);
2883
2884   sbitmap_vector_free (hoist_vbein);
2885   sbitmap_vector_free (hoist_vbeout);
2886
2887   free_dominance_info (CDI_DOMINATORS);
2888 }
2889
2890 /* Compute the very busy expressions at entry/exit from each block.
2891
2892    An expression is very busy if all paths from a given point
2893    compute the expression.  */
2894
2895 static void
2896 compute_code_hoist_vbeinout (void)
2897 {
2898   int changed, passes;
2899   basic_block bb;
2900
2901   bitmap_vector_clear (hoist_vbeout, last_basic_block_for_fn (cfun));
2902   bitmap_vector_clear (hoist_vbein, last_basic_block_for_fn (cfun));
2903
2904   passes = 0;
2905   changed = 1;
2906
2907   while (changed)
2908     {
2909       changed = 0;
2910
2911       /* We scan the blocks in the reverse order to speed up
2912          the convergence.  */
2913       FOR_EACH_BB_REVERSE_FN (bb, cfun)
2914         {
2915           if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
2916             {
2917               bitmap_intersection_of_succs (hoist_vbeout[bb->index],
2918                                             hoist_vbein, bb);
2919
2920               /* Include expressions in VBEout that are calculated
2921                  in BB and available at its end.  */
2922               bitmap_ior (hoist_vbeout[bb->index],
2923                               hoist_vbeout[bb->index], comp[bb->index]);
2924             }
2925
2926           changed |= bitmap_or_and (hoist_vbein[bb->index],
2927                                               antloc[bb->index],
2928                                               hoist_vbeout[bb->index],
2929                                               transp[bb->index]);
2930         }
2931
2932       passes++;
2933     }
2934
2935   if (dump_file)
2936     {
2937       fprintf (dump_file, "hoisting vbeinout computation: %d passes\n", passes);
2938
2939       FOR_EACH_BB_FN (bb, cfun)
2940         {
2941           fprintf (dump_file, "vbein (%d): ", bb->index);
2942           dump_bitmap_file (dump_file, hoist_vbein[bb->index]);
2943           fprintf (dump_file, "vbeout(%d): ", bb->index);
2944           dump_bitmap_file (dump_file, hoist_vbeout[bb->index]);
2945         }
2946     }
2947 }
2948
2949 /* Top level routine to do the dataflow analysis needed by code hoisting.  */
2950
2951 static void
2952 compute_code_hoist_data (void)
2953 {
2954   compute_local_properties (transp, comp, antloc, &expr_hash_table);
2955   prune_expressions (false);
2956   compute_code_hoist_vbeinout ();
2957   calculate_dominance_info (CDI_DOMINATORS);
2958   if (dump_file)
2959     fprintf (dump_file, "\n");
2960 }
2961
2962 /* Update register pressure for BB when hoisting an expression from
2963    instruction FROM, if live ranges of inputs are shrunk.  Also
2964    maintain live_in information if live range of register referred
2965    in FROM is shrunk.
2966    
2967    Return 0 if register pressure doesn't change, otherwise return
2968    the number by which register pressure is decreased.
2969    
2970    NOTE: Register pressure won't be increased in this function.  */
2971
2972 static int
2973 update_bb_reg_pressure (basic_block bb, rtx_insn *from)
2974 {
2975   rtx dreg;
2976   rtx_insn *insn;
2977   basic_block succ_bb;
2978   df_ref use, op_ref;
2979   edge succ;
2980   edge_iterator ei;
2981   int decreased_pressure = 0;
2982   int nregs;
2983   enum reg_class pressure_class;
2984
2985   FOR_EACH_INSN_USE (use, from)
2986     {
2987       dreg = DF_REF_REAL_REG (use);
2988       /* The live range of register is shrunk only if it isn't:
2989          1. referred on any path from the end of this block to EXIT, or
2990          2. referred by insns other than FROM in this block.  */
2991       FOR_EACH_EDGE (succ, ei, bb->succs)
2992         {
2993           succ_bb = succ->dest;
2994           if (succ_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
2995             continue;
2996
2997           if (bitmap_bit_p (BB_DATA (succ_bb)->live_in, REGNO (dreg)))
2998             break;
2999         }
3000       if (succ != NULL)
3001         continue;
3002
3003       op_ref = DF_REG_USE_CHAIN (REGNO (dreg));
3004       for (; op_ref; op_ref = DF_REF_NEXT_REG (op_ref))
3005         {
3006           if (!DF_REF_INSN_INFO (op_ref))
3007             continue;
3008
3009           insn = DF_REF_INSN (op_ref);
3010           if (BLOCK_FOR_INSN (insn) == bb
3011               && NONDEBUG_INSN_P (insn) && insn != from)
3012             break;
3013         }
3014
3015       pressure_class = get_regno_pressure_class (REGNO (dreg), &nregs);
3016       /* Decrease register pressure and update live_in information for
3017          this block.  */
3018       if (!op_ref && pressure_class != NO_REGS)
3019         {
3020           decreased_pressure += nregs;
3021           BB_DATA (bb)->max_reg_pressure[pressure_class] -= nregs;
3022           bitmap_clear_bit (BB_DATA (bb)->live_in, REGNO (dreg));
3023         }
3024     }
3025   return decreased_pressure;
3026 }
3027
3028 /* Determine if the expression EXPR should be hoisted to EXPR_BB up in
3029    flow graph, if it can reach BB unimpared.  Stop the search if the
3030    expression would need to be moved more than DISTANCE instructions.
3031
3032    DISTANCE is the number of instructions through which EXPR can be
3033    hoisted up in flow graph.
3034
3035    BB_SIZE points to an array which contains the number of instructions
3036    for each basic block.
3037
3038    PRESSURE_CLASS and NREGS are register class and number of hard registers
3039    for storing EXPR.
3040
3041    HOISTED_BBS points to a bitmap indicating basic blocks through which
3042    EXPR is hoisted.
3043
3044    FROM is the instruction from which EXPR is hoisted.
3045
3046    It's unclear exactly what Muchnick meant by "unimpared".  It seems
3047    to me that the expression must either be computed or transparent in
3048    *every* block in the path(s) from EXPR_BB to BB.  Any other definition
3049    would allow the expression to be hoisted out of loops, even if
3050    the expression wasn't a loop invariant.
3051
3052    Contrast this to reachability for PRE where an expression is
3053    considered reachable if *any* path reaches instead of *all*
3054    paths.  */
3055
3056 static int
3057 should_hoist_expr_to_dom (basic_block expr_bb, struct gcse_expr *expr,
3058                           basic_block bb, sbitmap visited, int distance,
3059                           int *bb_size, enum reg_class pressure_class,
3060                           int *nregs, bitmap hoisted_bbs, rtx_insn *from)
3061 {
3062   unsigned int i;
3063   edge pred;
3064   edge_iterator ei;
3065   sbitmap_iterator sbi;
3066   int visited_allocated_locally = 0;
3067   int decreased_pressure = 0;
3068
3069   if (flag_ira_hoist_pressure)
3070     {
3071       /* Record old information of basic block BB when it is visited
3072          at the first time.  */
3073       if (!bitmap_bit_p (hoisted_bbs, bb->index))
3074         {
3075           struct bb_data *data = BB_DATA (bb);
3076           bitmap_copy (data->backup, data->live_in);
3077           data->old_pressure = data->max_reg_pressure[pressure_class];
3078         }
3079       decreased_pressure = update_bb_reg_pressure (bb, from);
3080     }
3081   /* Terminate the search if distance, for which EXPR is allowed to move,
3082      is exhausted.  */
3083   if (distance > 0)
3084     {
3085       if (flag_ira_hoist_pressure)
3086         {
3087           /* Prefer to hoist EXPR if register pressure is decreased.  */
3088           if (decreased_pressure > *nregs)
3089             distance += bb_size[bb->index];
3090           /* Let EXPR be hoisted through basic block at no cost if one
3091              of following conditions is satisfied:
3092
3093              1. The basic block has low register pressure.
3094              2. Register pressure won't be increases after hoisting EXPR.
3095
3096              Constant expressions is handled conservatively, because
3097              hoisting constant expression aggressively results in worse
3098              code.  This decision is made by the observation of CSiBE
3099              on ARM target, while it has no obvious effect on other
3100              targets like x86, x86_64, mips and powerpc.  */
3101           else if (CONST_INT_P (expr->expr)
3102                    || (BB_DATA (bb)->max_reg_pressure[pressure_class]
3103                          >= ira_class_hard_regs_num[pressure_class]
3104                        && decreased_pressure < *nregs))
3105             distance -= bb_size[bb->index];
3106         }
3107       else
3108         distance -= bb_size[bb->index];
3109
3110       if (distance <= 0)
3111         return 0;
3112     }
3113   else
3114     gcc_assert (distance == 0);
3115
3116   if (visited == NULL)
3117     {
3118       visited_allocated_locally = 1;
3119       visited = sbitmap_alloc (last_basic_block_for_fn (cfun));
3120       bitmap_clear (visited);
3121     }
3122
3123   FOR_EACH_EDGE (pred, ei, bb->preds)
3124     {
3125       basic_block pred_bb = pred->src;
3126
3127       if (pred->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
3128         break;
3129       else if (pred_bb == expr_bb)
3130         continue;
3131       else if (bitmap_bit_p (visited, pred_bb->index))
3132         continue;
3133       else if (! bitmap_bit_p (transp[pred_bb->index], expr->bitmap_index))
3134         break;
3135       /* Not killed.  */
3136       else
3137         {
3138           bitmap_set_bit (visited, pred_bb->index);
3139           if (! should_hoist_expr_to_dom (expr_bb, expr, pred_bb,
3140                                           visited, distance, bb_size,
3141                                           pressure_class, nregs,
3142                                           hoisted_bbs, from))
3143             break;
3144         }
3145     }
3146   if (visited_allocated_locally)
3147     {
3148       /* If EXPR can be hoisted to expr_bb, record basic blocks through
3149          which EXPR is hoisted in hoisted_bbs.  */
3150       if (flag_ira_hoist_pressure && !pred)
3151         {
3152           /* Record the basic block from which EXPR is hoisted.  */
3153           bitmap_set_bit (visited, bb->index);
3154           EXECUTE_IF_SET_IN_BITMAP (visited, 0, i, sbi)
3155             bitmap_set_bit (hoisted_bbs, i);
3156         }
3157       sbitmap_free (visited);
3158     }
3159
3160   return (pred == NULL);
3161 }
3162 \f
3163 /* Find occurrence in BB.  */
3164
3165 static struct gcse_occr *
3166 find_occr_in_bb (struct gcse_occr *occr, basic_block bb)
3167 {
3168   /* Find the right occurrence of this expression.  */
3169   while (occr && BLOCK_FOR_INSN (occr->insn) != bb)
3170     occr = occr->next;
3171
3172   return occr;
3173 }
3174
3175 /* Actually perform code hoisting.
3176
3177    The code hoisting pass can hoist multiple computations of the same
3178    expression along dominated path to a dominating basic block, like
3179    from b2/b3 to b1 as depicted below:
3180
3181           b1      ------
3182           /\         |
3183          /  \        |
3184         bx   by   distance
3185        /      \      |
3186       /        \     |
3187      b2        b3 ------
3188
3189    Unfortunately code hoisting generally extends the live range of an
3190    output pseudo register, which increases register pressure and hurts
3191    register allocation.  To address this issue, an attribute MAX_DISTANCE
3192    is computed and attached to each expression.  The attribute is computed
3193    from rtx cost of the corresponding expression and it's used to control
3194    how long the expression can be hoisted up in flow graph.  As the
3195    expression is hoisted up in flow graph, GCC decreases its DISTANCE
3196    and stops the hoist if DISTANCE reaches 0.  Code hoisting can decrease
3197    register pressure if live ranges of inputs are shrunk.
3198
3199    Option "-fira-hoist-pressure" implements register pressure directed
3200    hoist based on upper method.  The rationale is:
3201      1. Calculate register pressure for each basic block by reusing IRA
3202         facility.
3203      2. When expression is hoisted through one basic block, GCC checks
3204         the change of live ranges for inputs/output.  The basic block's
3205         register pressure will be increased because of extended live
3206         range of output.  However, register pressure will be decreased
3207         if the live ranges of inputs are shrunk.
3208      3. After knowing how hoisting affects register pressure, GCC prefers
3209         to hoist the expression if it can decrease register pressure, by
3210         increasing DISTANCE of the corresponding expression.
3211      4. If hoisting the expression increases register pressure, GCC checks
3212         register pressure of the basic block and decrease DISTANCE only if
3213         the register pressure is high.  In other words, expression will be
3214         hoisted through at no cost if the basic block has low register
3215         pressure.
3216      5. Update register pressure information for basic blocks through
3217         which expression is hoisted.  */
3218
3219 static int
3220 hoist_code (void)
3221 {
3222   basic_block bb, dominated;
3223   vec<basic_block> dom_tree_walk;
3224   unsigned int dom_tree_walk_index;
3225   vec<basic_block> domby;
3226   unsigned int i, j, k;
3227   struct gcse_expr **index_map;
3228   struct gcse_expr *expr;
3229   int *to_bb_head;
3230   int *bb_size;
3231   int changed = 0;
3232   struct bb_data *data;
3233   /* Basic blocks that have occurrences reachable from BB.  */
3234   bitmap from_bbs;
3235   /* Basic blocks through which expr is hoisted.  */
3236   bitmap hoisted_bbs = NULL;
3237   bitmap_iterator bi;
3238
3239   /* Compute a mapping from expression number (`bitmap_index') to
3240      hash table entry.  */
3241
3242   index_map = XCNEWVEC (struct gcse_expr *, expr_hash_table.n_elems);
3243   for (i = 0; i < expr_hash_table.size; i++)
3244     for (expr = expr_hash_table.table[i]; expr; expr = expr->next_same_hash)
3245       index_map[expr->bitmap_index] = expr;
3246
3247   /* Calculate sizes of basic blocks and note how far
3248      each instruction is from the start of its block.  We then use this
3249      data to restrict distance an expression can travel.  */
3250
3251   to_bb_head = XCNEWVEC (int, get_max_uid ());
3252   bb_size = XCNEWVEC (int, last_basic_block_for_fn (cfun));
3253
3254   FOR_EACH_BB_FN (bb, cfun)
3255     {
3256       rtx_insn *insn;
3257       int to_head;
3258
3259       to_head = 0;
3260       FOR_BB_INSNS (bb, insn)
3261         {
3262           /* Don't count debug instructions to avoid them affecting
3263              decision choices.  */
3264           if (NONDEBUG_INSN_P (insn))
3265             to_bb_head[INSN_UID (insn)] = to_head++;
3266         }
3267
3268       bb_size[bb->index] = to_head;
3269     }
3270
3271   gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs) == 1
3272               && (EDGE_SUCC (ENTRY_BLOCK_PTR_FOR_FN (cfun), 0)->dest
3273                   == ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb));
3274
3275   from_bbs = BITMAP_ALLOC (NULL);
3276   if (flag_ira_hoist_pressure)
3277     hoisted_bbs = BITMAP_ALLOC (NULL);
3278
3279   dom_tree_walk = get_all_dominated_blocks (CDI_DOMINATORS,
3280                                             ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb);
3281
3282   /* Walk over each basic block looking for potentially hoistable
3283      expressions, nothing gets hoisted from the entry block.  */
3284   FOR_EACH_VEC_ELT (dom_tree_walk, dom_tree_walk_index, bb)
3285     {
3286       domby = get_dominated_to_depth (CDI_DOMINATORS, bb, MAX_HOIST_DEPTH);
3287
3288       if (domby.length () == 0)
3289         continue;
3290
3291       /* Examine each expression that is very busy at the exit of this
3292          block.  These are the potentially hoistable expressions.  */
3293       for (i = 0; i < SBITMAP_SIZE (hoist_vbeout[bb->index]); i++)
3294         {
3295           if (bitmap_bit_p (hoist_vbeout[bb->index], i))
3296             {
3297               int nregs = 0;
3298               enum reg_class pressure_class = NO_REGS;
3299               /* Current expression.  */
3300               struct gcse_expr *expr = index_map[i];
3301               /* Number of occurrences of EXPR that can be hoisted to BB.  */
3302               int hoistable = 0;
3303               /* Occurrences reachable from BB.  */
3304               vec<occr_t> occrs_to_hoist = vNULL;
3305               /* We want to insert the expression into BB only once, so
3306                  note when we've inserted it.  */
3307               int insn_inserted_p;
3308               occr_t occr;
3309
3310               /* If an expression is computed in BB and is available at end of
3311                  BB, hoist all occurrences dominated by BB to BB.  */
3312               if (bitmap_bit_p (comp[bb->index], i))
3313                 {
3314                   occr = find_occr_in_bb (expr->antic_occr, bb);
3315
3316                   if (occr)
3317                     {
3318                       /* An occurrence might've been already deleted
3319                          while processing a dominator of BB.  */
3320                       if (!occr->deleted_p)
3321                         {
3322                           gcc_assert (NONDEBUG_INSN_P (occr->insn));
3323                           hoistable++;
3324                         }
3325                     }
3326                   else
3327                     hoistable++;
3328                 }
3329
3330               /* We've found a potentially hoistable expression, now
3331                  we look at every block BB dominates to see if it
3332                  computes the expression.  */
3333               FOR_EACH_VEC_ELT (domby, j, dominated)
3334                 {
3335                   int max_distance;
3336
3337                   /* Ignore self dominance.  */
3338                   if (bb == dominated)
3339                     continue;
3340                   /* We've found a dominated block, now see if it computes
3341                      the busy expression and whether or not moving that
3342                      expression to the "beginning" of that block is safe.  */
3343                   if (!bitmap_bit_p (antloc[dominated->index], i))
3344                     continue;
3345
3346                   occr = find_occr_in_bb (expr->antic_occr, dominated);
3347                   gcc_assert (occr);
3348
3349                   /* An occurrence might've been already deleted
3350                      while processing a dominator of BB.  */
3351                   if (occr->deleted_p)
3352                     continue;
3353                   gcc_assert (NONDEBUG_INSN_P (occr->insn));
3354
3355                   max_distance = expr->max_distance;
3356                   if (max_distance > 0)
3357                     /* Adjust MAX_DISTANCE to account for the fact that
3358                        OCCR won't have to travel all of DOMINATED, but
3359                        only part of it.  */
3360                     max_distance += (bb_size[dominated->index]
3361                                      - to_bb_head[INSN_UID (occr->insn)]);
3362
3363                   pressure_class = get_pressure_class_and_nregs (occr->insn,
3364                                                                  &nregs);
3365
3366                   /* Note if the expression should be hoisted from the dominated
3367                      block to BB if it can reach DOMINATED unimpared.
3368
3369                      Keep track of how many times this expression is hoistable
3370                      from a dominated block into BB.  */
3371                   if (should_hoist_expr_to_dom (bb, expr, dominated, NULL,
3372                                                 max_distance, bb_size,
3373                                                 pressure_class, &nregs,
3374                                                 hoisted_bbs, occr->insn))
3375                     {
3376                       hoistable++;
3377                       occrs_to_hoist.safe_push (occr);
3378                       bitmap_set_bit (from_bbs, dominated->index);
3379                     }
3380                 }
3381
3382               /* If we found more than one hoistable occurrence of this
3383                  expression, then note it in the vector of expressions to
3384                  hoist.  It makes no sense to hoist things which are computed
3385                  in only one BB, and doing so tends to pessimize register
3386                  allocation.  One could increase this value to try harder
3387                  to avoid any possible code expansion due to register
3388                  allocation issues; however experiments have shown that
3389                  the vast majority of hoistable expressions are only movable
3390                  from two successors, so raising this threshold is likely
3391                  to nullify any benefit we get from code hoisting.  */
3392               if (hoistable > 1 && dbg_cnt (hoist_insn))
3393                 {
3394                   /* If (hoistable != vec::length), then there is
3395                      an occurrence of EXPR in BB itself.  Don't waste
3396                      time looking for LCA in this case.  */
3397                   if ((unsigned) hoistable == occrs_to_hoist.length ())
3398                     {
3399                       basic_block lca;
3400
3401                       lca = nearest_common_dominator_for_set (CDI_DOMINATORS,
3402                                                               from_bbs);
3403                       if (lca != bb)
3404                         /* Punt, it's better to hoist these occurrences to
3405                            LCA.  */
3406                         occrs_to_hoist.release ();
3407                     }
3408                 }
3409               else
3410                 /* Punt, no point hoisting a single occurrence.  */
3411                 occrs_to_hoist.release ();
3412
3413               if (flag_ira_hoist_pressure
3414                   && !occrs_to_hoist.is_empty ())
3415                 {
3416                   /* Increase register pressure of basic blocks to which
3417                      expr is hoisted because of extended live range of
3418                      output.  */
3419                   data = BB_DATA (bb);
3420                   data->max_reg_pressure[pressure_class] += nregs;
3421                   EXECUTE_IF_SET_IN_BITMAP (hoisted_bbs, 0, k, bi)
3422                     {
3423                       data = BB_DATA (BASIC_BLOCK_FOR_FN (cfun, k));
3424                       data->max_reg_pressure[pressure_class] += nregs;
3425                     }
3426                 }
3427               else if (flag_ira_hoist_pressure)
3428                 {
3429                   /* Restore register pressure and live_in info for basic
3430                      blocks recorded in hoisted_bbs when expr will not be
3431                      hoisted.  */
3432                   EXECUTE_IF_SET_IN_BITMAP (hoisted_bbs, 0, k, bi)
3433                     {
3434                       data = BB_DATA (BASIC_BLOCK_FOR_FN (cfun, k));
3435                       bitmap_copy (data->live_in, data->backup);
3436                       data->max_reg_pressure[pressure_class]
3437                           = data->old_pressure;
3438                     }
3439                 }
3440
3441               if (flag_ira_hoist_pressure)
3442                 bitmap_clear (hoisted_bbs);
3443
3444               insn_inserted_p = 0;
3445
3446               /* Walk through occurrences of I'th expressions we want
3447                  to hoist to BB and make the transformations.  */
3448               FOR_EACH_VEC_ELT (occrs_to_hoist, j, occr)
3449                 {
3450                   rtx_insn *insn;
3451                   const_rtx set;
3452
3453                   gcc_assert (!occr->deleted_p);
3454
3455                   insn = occr->insn;
3456                   set = single_set_gcse (insn);
3457
3458                   /* Create a pseudo-reg to store the result of reaching
3459                      expressions into.  Get the mode for the new pseudo
3460                      from the mode of the original destination pseudo.
3461
3462                      It is important to use new pseudos whenever we
3463                      emit a set.  This will allow reload to use
3464                      rematerialization for such registers.  */
3465                   if (!insn_inserted_p)
3466                     expr->reaching_reg
3467                       = gen_reg_rtx_and_attrs (SET_DEST (set));
3468
3469                   gcse_emit_move_after (SET_DEST (set), expr->reaching_reg,
3470                                         insn);
3471                   delete_insn (insn);
3472                   occr->deleted_p = 1;
3473                   changed = 1;
3474                   gcse_subst_count++;
3475
3476                   if (!insn_inserted_p)
3477                     {
3478                       insert_insn_end_basic_block (expr, bb);
3479                       insn_inserted_p = 1;
3480                     }
3481                 }
3482
3483               occrs_to_hoist.release ();
3484               bitmap_clear (from_bbs);
3485             }
3486         }
3487       domby.release ();
3488     }
3489
3490   dom_tree_walk.release ();
3491   BITMAP_FREE (from_bbs);
3492   if (flag_ira_hoist_pressure)
3493     BITMAP_FREE (hoisted_bbs);
3494
3495   free (bb_size);
3496   free (to_bb_head);
3497   free (index_map);
3498
3499   return changed;
3500 }
3501
3502 /* Return pressure class and number of needed hard registers (through
3503    *NREGS) of register REGNO.  */
3504 static enum reg_class
3505 get_regno_pressure_class (int regno, int *nregs)
3506 {
3507   if (regno >= FIRST_PSEUDO_REGISTER)
3508     {
3509       enum reg_class pressure_class;
3510
3511       pressure_class = reg_allocno_class (regno);
3512       pressure_class = ira_pressure_class_translate[pressure_class];
3513       *nregs
3514         = ira_reg_class_max_nregs[pressure_class][PSEUDO_REGNO_MODE (regno)];
3515       return pressure_class;
3516     }
3517   else if (! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno)
3518            && ! TEST_HARD_REG_BIT (eliminable_regset, regno))
3519     {
3520       *nregs = 1;
3521       return ira_pressure_class_translate[REGNO_REG_CLASS (regno)];
3522     }
3523   else
3524     {
3525       *nregs = 0;
3526       return NO_REGS;
3527     }
3528 }
3529
3530 /* Return pressure class and number of hard registers (through *NREGS)
3531    for destination of INSN. */
3532 static enum reg_class
3533 get_pressure_class_and_nregs (rtx_insn *insn, int *nregs)
3534 {
3535   rtx reg;
3536   enum reg_class pressure_class;
3537   const_rtx set = single_set_gcse (insn);
3538
3539   reg = SET_DEST (set);
3540   if (GET_CODE (reg) == SUBREG)
3541     reg = SUBREG_REG (reg);
3542   if (MEM_P (reg))
3543     {
3544       *nregs = 0;
3545       pressure_class = NO_REGS;
3546     }
3547   else
3548     {
3549       gcc_assert (REG_P (reg));
3550       pressure_class = reg_allocno_class (REGNO (reg));
3551       pressure_class = ira_pressure_class_translate[pressure_class];
3552       *nregs
3553         = ira_reg_class_max_nregs[pressure_class][GET_MODE (SET_SRC (set))];
3554     }
3555   return pressure_class;
3556 }
3557
3558 /* Increase (if INCR_P) or decrease current register pressure for
3559    register REGNO.  */
3560 static void
3561 change_pressure (int regno, bool incr_p)
3562 {
3563   int nregs;
3564   enum reg_class pressure_class;
3565
3566   pressure_class = get_regno_pressure_class (regno, &nregs);
3567   if (! incr_p)
3568     curr_reg_pressure[pressure_class] -= nregs;
3569   else
3570     {
3571       curr_reg_pressure[pressure_class] += nregs;
3572       if (BB_DATA (curr_bb)->max_reg_pressure[pressure_class]
3573           < curr_reg_pressure[pressure_class])
3574         BB_DATA (curr_bb)->max_reg_pressure[pressure_class]
3575           = curr_reg_pressure[pressure_class];
3576     }
3577 }
3578
3579 /* Calculate register pressure for each basic block by walking insns
3580    from last to first.  */
3581 static void
3582 calculate_bb_reg_pressure (void)
3583 {
3584   int i;
3585   unsigned int j;
3586   rtx_insn *insn;
3587   basic_block bb;
3588   bitmap curr_regs_live;
3589   bitmap_iterator bi;
3590
3591
3592   ira_setup_eliminable_regset ();
3593   curr_regs_live = BITMAP_ALLOC (&reg_obstack);
3594   FOR_EACH_BB_FN (bb, cfun)
3595     {
3596       curr_bb = bb;
3597       BB_DATA (bb)->live_in = BITMAP_ALLOC (NULL);
3598       BB_DATA (bb)->backup = BITMAP_ALLOC (NULL);
3599       bitmap_copy (BB_DATA (bb)->live_in, df_get_live_in (bb));
3600       bitmap_copy (curr_regs_live, df_get_live_out (bb));
3601       for (i = 0; i < ira_pressure_classes_num; i++)
3602         curr_reg_pressure[ira_pressure_classes[i]] = 0;
3603       EXECUTE_IF_SET_IN_BITMAP (curr_regs_live, 0, j, bi)
3604         change_pressure (j, true);
3605
3606       FOR_BB_INSNS_REVERSE (bb, insn)
3607         {
3608           rtx dreg;
3609           int regno;
3610           df_ref def, use;
3611
3612           if (! NONDEBUG_INSN_P (insn))
3613             continue;
3614
3615           FOR_EACH_INSN_DEF (def, insn)
3616             {
3617               dreg = DF_REF_REAL_REG (def);
3618               gcc_assert (REG_P (dreg));
3619               regno = REGNO (dreg);
3620               if (!(DF_REF_FLAGS (def)
3621                     & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
3622                 {
3623                   if (bitmap_clear_bit (curr_regs_live, regno))
3624                     change_pressure (regno, false);
3625                 }
3626             }
3627
3628           FOR_EACH_INSN_USE (use, insn)
3629             {
3630               dreg = DF_REF_REAL_REG (use);
3631               gcc_assert (REG_P (dreg));
3632               regno = REGNO (dreg);
3633               if (bitmap_set_bit (curr_regs_live, regno))
3634                 change_pressure (regno, true);
3635             }
3636         }
3637     }
3638   BITMAP_FREE (curr_regs_live);
3639
3640   if (dump_file == NULL)
3641     return;
3642
3643   fprintf (dump_file, "\nRegister Pressure: \n");
3644   FOR_EACH_BB_FN (bb, cfun)
3645     {
3646       fprintf (dump_file, "  Basic block %d: \n", bb->index);
3647       for (i = 0; (int) i < ira_pressure_classes_num; i++)
3648         {
3649           enum reg_class pressure_class;
3650
3651           pressure_class = ira_pressure_classes[i];
3652           if (BB_DATA (bb)->max_reg_pressure[pressure_class] == 0)
3653             continue;
3654
3655           fprintf (dump_file, "    %s=%d\n", reg_class_names[pressure_class],
3656                    BB_DATA (bb)->max_reg_pressure[pressure_class]);
3657         }
3658     }
3659   fprintf (dump_file, "\n");
3660 }
3661
3662 /* Top level routine to perform one code hoisting (aka unification) pass
3663
3664    Return nonzero if a change was made.  */
3665
3666 static int
3667 one_code_hoisting_pass (void)
3668 {
3669   int changed = 0;
3670
3671   gcse_subst_count = 0;
3672   gcse_create_count = 0;
3673
3674   /* Return if there's nothing to do, or it is too expensive.  */
3675   if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1
3676       || is_too_expensive (_("GCSE disabled")))
3677     return 0;
3678
3679   doing_code_hoisting_p = true;
3680
3681   /* Calculate register pressure for each basic block.  */
3682   if (flag_ira_hoist_pressure)
3683     {
3684       regstat_init_n_sets_and_refs ();
3685       ira_set_pseudo_classes (false, dump_file);
3686       alloc_aux_for_blocks (sizeof (struct bb_data));
3687       calculate_bb_reg_pressure ();
3688       regstat_free_n_sets_and_refs ();
3689     }
3690
3691   /* We need alias.  */
3692   init_alias_analysis ();
3693
3694   bytes_used = 0;
3695   gcc_obstack_init (&gcse_obstack);
3696   alloc_gcse_mem ();
3697
3698   alloc_hash_table (&expr_hash_table);
3699   compute_hash_table (&expr_hash_table);
3700   if (dump_file)
3701     dump_hash_table (dump_file, "Code Hosting Expressions", &expr_hash_table);
3702
3703   if (expr_hash_table.n_elems > 0)
3704     {
3705       alloc_code_hoist_mem (last_basic_block_for_fn (cfun),
3706                             expr_hash_table.n_elems);
3707       compute_code_hoist_data ();
3708       changed = hoist_code ();
3709       free_code_hoist_mem ();
3710     }
3711
3712   if (flag_ira_hoist_pressure)
3713     {
3714       free_aux_for_blocks ();
3715       free_reg_info ();
3716     }
3717   free_hash_table (&expr_hash_table);
3718   free_gcse_mem ();
3719   obstack_free (&gcse_obstack, NULL);
3720
3721   /* We are finished with alias.  */
3722   end_alias_analysis ();
3723
3724   if (dump_file)
3725     {
3726       fprintf (dump_file, "HOIST of %s, %d basic blocks, %d bytes needed, ",
3727                current_function_name (), n_basic_blocks_for_fn (cfun),
3728                bytes_used);
3729       fprintf (dump_file, "%d substs, %d insns created\n",
3730                gcse_subst_count, gcse_create_count);
3731     }
3732
3733   doing_code_hoisting_p = false;
3734
3735   return changed;
3736 }
3737 \f
3738 /*  Here we provide the things required to do store motion towards the exit.
3739     In order for this to be effective, gcse also needed to be taught how to
3740     move a load when it is killed only by a store to itself.
3741
3742             int i;
3743             float a[10];
3744
3745             void foo(float scale)
3746             {
3747               for (i=0; i<10; i++)
3748                 a[i] *= scale;
3749             }
3750
3751     'i' is both loaded and stored to in the loop. Normally, gcse cannot move
3752     the load out since its live around the loop, and stored at the bottom
3753     of the loop.
3754
3755       The 'Load Motion' referred to and implemented in this file is
3756     an enhancement to gcse which when using edge based LCM, recognizes
3757     this situation and allows gcse to move the load out of the loop.
3758
3759       Once gcse has hoisted the load, store motion can then push this
3760     load towards the exit, and we end up with no loads or stores of 'i'
3761     in the loop.  */
3762
3763 /* This will search the ldst list for a matching expression. If it
3764    doesn't find one, we create one and initialize it.  */
3765
3766 static struct ls_expr *
3767 ldst_entry (rtx x)
3768 {
3769   int do_not_record_p = 0;
3770   struct ls_expr * ptr;
3771   unsigned int hash;
3772   ls_expr **slot;
3773   struct ls_expr e;
3774
3775   hash = hash_rtx (x, GET_MODE (x), &do_not_record_p,
3776                    NULL,  /*have_reg_qty=*/false);
3777
3778   e.pattern = x;
3779   slot = pre_ldst_table->find_slot_with_hash (&e, hash, INSERT);
3780   if (*slot)
3781     return *slot;
3782
3783   ptr = XNEW (struct ls_expr);
3784
3785   ptr->next         = pre_ldst_mems;
3786   ptr->expr         = NULL;
3787   ptr->pattern      = x;
3788   ptr->pattern_regs = NULL_RTX;
3789   ptr->loads        = NULL;
3790   ptr->stores       = NULL;
3791   ptr->reaching_reg = NULL_RTX;
3792   ptr->invalid      = 0;
3793   ptr->index        = 0;
3794   ptr->hash_index   = hash;
3795   pre_ldst_mems     = ptr;
3796   *slot = ptr;
3797
3798   return ptr;
3799 }
3800
3801 /* Free up an individual ldst entry.  */
3802
3803 static void
3804 free_ldst_entry (struct ls_expr * ptr)
3805 {
3806   free_INSN_LIST_list (& ptr->loads);
3807   free_INSN_LIST_list (& ptr->stores);
3808
3809   free (ptr);
3810 }
3811
3812 /* Free up all memory associated with the ldst list.  */
3813
3814 static void
3815 free_ld_motion_mems (void)
3816 {
3817   delete pre_ldst_table;
3818   pre_ldst_table = NULL;
3819
3820   while (pre_ldst_mems)
3821     {
3822       struct ls_expr * tmp = pre_ldst_mems;
3823
3824       pre_ldst_mems = pre_ldst_mems->next;
3825
3826       free_ldst_entry (tmp);
3827     }
3828
3829   pre_ldst_mems = NULL;
3830 }
3831
3832 /* Dump debugging info about the ldst list.  */
3833
3834 static void
3835 print_ldst_list (FILE * file)
3836 {
3837   struct ls_expr * ptr;
3838
3839   fprintf (file, "LDST list: \n");
3840
3841   for (ptr = pre_ldst_mems; ptr != NULL; ptr = ptr->next)
3842     {
3843       fprintf (file, "  Pattern (%3d): ", ptr->index);
3844
3845       print_rtl (file, ptr->pattern);
3846
3847       fprintf (file, "\n         Loads : ");
3848
3849       if (ptr->loads)
3850         print_rtl (file, ptr->loads);
3851       else
3852         fprintf (file, "(nil)");
3853
3854       fprintf (file, "\n        Stores : ");
3855
3856       if (ptr->stores)
3857         print_rtl (file, ptr->stores);
3858       else
3859         fprintf (file, "(nil)");
3860
3861       fprintf (file, "\n\n");
3862     }
3863
3864   fprintf (file, "\n");
3865 }
3866
3867 /* Returns 1 if X is in the list of ldst only expressions.  */
3868
3869 static struct ls_expr *
3870 find_rtx_in_ldst (rtx x)
3871 {
3872   struct ls_expr e;
3873   ls_expr **slot;
3874   if (!pre_ldst_table)
3875     return NULL;
3876   e.pattern = x;
3877   slot = pre_ldst_table->find_slot (&e, NO_INSERT);
3878   if (!slot || (*slot)->invalid)
3879     return NULL;
3880   return *slot;
3881 }
3882 \f
3883 /* Load Motion for loads which only kill themselves.  */
3884
3885 /* Return true if x, a MEM, is a simple access with no side effects.
3886    These are the types of loads we consider for the ld_motion list,
3887    otherwise we let the usual aliasing take care of it.  */
3888
3889 static int
3890 simple_mem (const_rtx x)
3891 {
3892   if (MEM_VOLATILE_P (x))
3893     return 0;
3894
3895   if (GET_MODE (x) == BLKmode)
3896     return 0;
3897
3898   /* If we are handling exceptions, we must be careful with memory references
3899      that may trap.  If we are not, the behavior is undefined, so we may just
3900      continue.  */
3901   if (cfun->can_throw_non_call_exceptions && may_trap_p (x))
3902     return 0;
3903
3904   if (side_effects_p (x))
3905     return 0;
3906
3907   /* Do not consider function arguments passed on stack.  */
3908   if (reg_mentioned_p (stack_pointer_rtx, x))
3909     return 0;
3910
3911   if (flag_float_store && FLOAT_MODE_P (GET_MODE (x)))
3912     return 0;
3913
3914   return 1;
3915 }
3916
3917 /* Make sure there isn't a buried reference in this pattern anywhere.
3918    If there is, invalidate the entry for it since we're not capable
3919    of fixing it up just yet.. We have to be sure we know about ALL
3920    loads since the aliasing code will allow all entries in the
3921    ld_motion list to not-alias itself.  If we miss a load, we will get
3922    the wrong value since gcse might common it and we won't know to
3923    fix it up.  */
3924
3925 static void
3926 invalidate_any_buried_refs (rtx x)
3927 {
3928   const char * fmt;
3929   int i, j;
3930   struct ls_expr * ptr;
3931
3932   /* Invalidate it in the list.  */
3933   if (MEM_P (x) && simple_mem (x))
3934     {
3935       ptr = ldst_entry (x);
3936       ptr->invalid = 1;
3937     }
3938
3939   /* Recursively process the insn.  */
3940   fmt = GET_RTX_FORMAT (GET_CODE (x));
3941
3942   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
3943     {
3944       if (fmt[i] == 'e')
3945         invalidate_any_buried_refs (XEXP (x, i));
3946       else if (fmt[i] == 'E')
3947         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3948           invalidate_any_buried_refs (XVECEXP (x, i, j));
3949     }
3950 }
3951
3952 /* Find all the 'simple' MEMs which are used in LOADs and STORES.  Simple
3953    being defined as MEM loads and stores to symbols, with no side effects
3954    and no registers in the expression.  For a MEM destination, we also
3955    check that the insn is still valid if we replace the destination with a
3956    REG, as is done in update_ld_motion_stores.  If there are any uses/defs
3957    which don't match this criteria, they are invalidated and trimmed out
3958    later.  */
3959
3960 static void
3961 compute_ld_motion_mems (void)
3962 {
3963   struct ls_expr * ptr;
3964   basic_block bb;
3965   rtx_insn *insn;
3966
3967   pre_ldst_mems = NULL;
3968   pre_ldst_table = new hash_table<pre_ldst_expr_hasher> (13);
3969
3970   FOR_EACH_BB_FN (bb, cfun)
3971     {
3972       FOR_BB_INSNS (bb, insn)
3973         {
3974           if (NONDEBUG_INSN_P (insn))
3975             {
3976               if (GET_CODE (PATTERN (insn)) == SET)
3977                 {
3978                   rtx src = SET_SRC (PATTERN (insn));
3979                   rtx dest = SET_DEST (PATTERN (insn));
3980                   rtx note = find_reg_equal_equiv_note (insn);
3981                   rtx src_eq;
3982
3983                   /* Check for a simple LOAD...  */
3984                   if (MEM_P (src) && simple_mem (src))
3985                     {
3986                       ptr = ldst_entry (src);
3987                       if (REG_P (dest))
3988                         ptr->loads = alloc_INSN_LIST (insn, ptr->loads);
3989                       else
3990                         ptr->invalid = 1;
3991                     }
3992                   else
3993                     {
3994                       /* Make sure there isn't a buried load somewhere.  */
3995                       invalidate_any_buried_refs (src);
3996                     }
3997
3998                   if (note != 0 && REG_NOTE_KIND (note) == REG_EQUAL)
3999                     src_eq = XEXP (note, 0);
4000                   else
4001                     src_eq = NULL_RTX;
4002
4003                   if (src_eq != NULL_RTX
4004                       && !(MEM_P (src_eq) && simple_mem (src_eq)))
4005                     invalidate_any_buried_refs (src_eq);
4006
4007                   /* Check for stores. Don't worry about aliased ones, they
4008                      will block any movement we might do later. We only care
4009                      about this exact pattern since those are the only
4010                      circumstance that we will ignore the aliasing info.  */
4011                   if (MEM_P (dest) && simple_mem (dest))
4012                     {
4013                       ptr = ldst_entry (dest);
4014
4015                       if (! MEM_P (src)
4016                           && GET_CODE (src) != ASM_OPERANDS
4017                           /* Check for REG manually since want_to_gcse_p
4018                              returns 0 for all REGs.  */
4019                           && can_assign_to_reg_without_clobbers_p (src))
4020                         ptr->stores = alloc_INSN_LIST (insn, ptr->stores);
4021                       else
4022                         ptr->invalid = 1;
4023                     }
4024                 }
4025               else
4026                 invalidate_any_buried_refs (PATTERN (insn));
4027             }
4028         }
4029     }
4030 }
4031
4032 /* Remove any references that have been either invalidated or are not in the
4033    expression list for pre gcse.  */
4034
4035 static void
4036 trim_ld_motion_mems (void)
4037 {
4038   struct ls_expr * * last = & pre_ldst_mems;
4039   struct ls_expr * ptr = pre_ldst_mems;
4040
4041   while (ptr != NULL)
4042     {
4043       struct gcse_expr * expr;
4044
4045       /* Delete if entry has been made invalid.  */
4046       if (! ptr->invalid)
4047         {
4048           /* Delete if we cannot find this mem in the expression list.  */
4049           unsigned int hash = ptr->hash_index % expr_hash_table.size;
4050
4051           for (expr = expr_hash_table.table[hash];
4052                expr != NULL;
4053                expr = expr->next_same_hash)
4054             if (expr_equiv_p (expr->expr, ptr->pattern))
4055               break;
4056         }
4057       else
4058         expr = (struct gcse_expr *) 0;
4059
4060       if (expr)
4061         {
4062           /* Set the expression field if we are keeping it.  */
4063           ptr->expr = expr;
4064           last = & ptr->next;
4065           ptr = ptr->next;
4066         }
4067       else
4068         {
4069           *last = ptr->next;
4070           pre_ldst_table->remove_elt_with_hash (ptr, ptr->hash_index);
4071           free_ldst_entry (ptr);
4072           ptr = * last;
4073         }
4074     }
4075
4076   /* Show the world what we've found.  */
4077   if (dump_file && pre_ldst_mems != NULL)
4078     print_ldst_list (dump_file);
4079 }
4080
4081 /* This routine will take an expression which we are replacing with
4082    a reaching register, and update any stores that are needed if
4083    that expression is in the ld_motion list.  Stores are updated by
4084    copying their SRC to the reaching register, and then storing
4085    the reaching register into the store location. These keeps the
4086    correct value in the reaching register for the loads.  */
4087
4088 static void
4089 update_ld_motion_stores (struct gcse_expr * expr)
4090 {
4091   struct ls_expr * mem_ptr;
4092
4093   if ((mem_ptr = find_rtx_in_ldst (expr->expr)))
4094     {
4095       /* We can try to find just the REACHED stores, but is shouldn't
4096          matter to set the reaching reg everywhere...  some might be
4097          dead and should be eliminated later.  */
4098
4099       /* We replace (set mem expr) with (set reg expr) (set mem reg)
4100          where reg is the reaching reg used in the load.  We checked in
4101          compute_ld_motion_mems that we can replace (set mem expr) with
4102          (set reg expr) in that insn.  */
4103       rtx list = mem_ptr->stores;
4104
4105       for ( ; list != NULL_RTX; list = XEXP (list, 1))
4106         {
4107           rtx_insn *insn = as_a <rtx_insn *> (XEXP (list, 0));
4108           rtx pat = PATTERN (insn);
4109           rtx src = SET_SRC (pat);
4110           rtx reg = expr->reaching_reg;
4111           rtx copy;
4112
4113           /* If we've already copied it, continue.  */
4114           if (expr->reaching_reg == src)
4115             continue;
4116
4117           if (dump_file)
4118             {
4119               fprintf (dump_file, "PRE:  store updated with reaching reg ");
4120               print_rtl (dump_file, reg);
4121               fprintf (dump_file, ":\n  ");
4122               print_inline_rtx (dump_file, insn, 8);
4123               fprintf (dump_file, "\n");
4124             }
4125
4126           copy = gen_move_insn (reg, copy_rtx (SET_SRC (pat)));
4127           emit_insn_before (copy, insn);
4128           SET_SRC (pat) = reg;
4129           df_insn_rescan (insn);
4130
4131           /* un-recognize this pattern since it's probably different now.  */
4132           INSN_CODE (insn) = -1;
4133           gcse_create_count++;
4134         }
4135     }
4136 }
4137 \f
4138 /* Return true if the graph is too expensive to optimize. PASS is the
4139    optimization about to be performed.  */
4140
4141 static bool
4142 is_too_expensive (const char *pass)
4143 {
4144   /* Trying to perform global optimizations on flow graphs which have
4145      a high connectivity will take a long time and is unlikely to be
4146      particularly useful.
4147
4148      In normal circumstances a cfg should have about twice as many
4149      edges as blocks.  But we do not want to punish small functions
4150      which have a couple switch statements.  Rather than simply
4151      threshold the number of blocks, uses something with a more
4152      graceful degradation.  */
4153   if (n_edges_for_fn (cfun) > 20000 + n_basic_blocks_for_fn (cfun) * 4)
4154     {
4155       warning (OPT_Wdisabled_optimization,
4156                "%s: %d basic blocks and %d edges/basic block",
4157                pass, n_basic_blocks_for_fn (cfun),
4158                n_edges_for_fn (cfun) / n_basic_blocks_for_fn (cfun));
4159
4160       return true;
4161     }
4162
4163   /* If allocating memory for the dataflow bitmaps would take up too much
4164      storage it's better just to disable the optimization.  */
4165   if ((n_basic_blocks_for_fn (cfun)
4166        * SBITMAP_SET_SIZE (max_reg_num ())
4167        * sizeof (SBITMAP_ELT_TYPE)) > MAX_GCSE_MEMORY)
4168     {
4169       warning (OPT_Wdisabled_optimization,
4170                "%s: %d basic blocks and %d registers",
4171                pass, n_basic_blocks_for_fn (cfun), max_reg_num ());
4172
4173       return true;
4174     }
4175
4176   return false;
4177 }
4178 \f
4179 static unsigned int
4180 execute_rtl_pre (void)
4181 {
4182   int changed;
4183   delete_unreachable_blocks ();
4184   df_analyze ();
4185   changed = one_pre_gcse_pass ();
4186   flag_rerun_cse_after_global_opts |= changed;
4187   if (changed)
4188     cleanup_cfg (0);
4189   return 0;
4190 }
4191
4192 static unsigned int
4193 execute_rtl_hoist (void)
4194 {
4195   int changed;
4196   delete_unreachable_blocks ();
4197   df_analyze ();
4198   changed = one_code_hoisting_pass ();
4199   flag_rerun_cse_after_global_opts |= changed;
4200   if (changed)
4201     cleanup_cfg (0);
4202   return 0;
4203 }
4204
4205 namespace {
4206
4207 const pass_data pass_data_rtl_pre =
4208 {
4209   RTL_PASS, /* type */
4210   "rtl pre", /* name */
4211   OPTGROUP_NONE, /* optinfo_flags */
4212   TV_PRE, /* tv_id */
4213   PROP_cfglayout, /* properties_required */
4214   0, /* properties_provided */
4215   0, /* properties_destroyed */
4216   0, /* todo_flags_start */
4217   TODO_df_finish, /* todo_flags_finish */
4218 };
4219
4220 class pass_rtl_pre : public rtl_opt_pass
4221 {
4222 public:
4223   pass_rtl_pre (gcc::context *ctxt)
4224     : rtl_opt_pass (pass_data_rtl_pre, ctxt)
4225   {}
4226
4227   /* opt_pass methods: */
4228   virtual bool gate (function *);
4229   virtual unsigned int execute (function *) { return execute_rtl_pre (); }
4230
4231 }; // class pass_rtl_pre
4232
4233 /* We do not construct an accurate cfg in functions which call
4234    setjmp, so none of these passes runs if the function calls
4235    setjmp.
4236    FIXME: Should just handle setjmp via REG_SETJMP notes.  */
4237
4238 bool
4239 pass_rtl_pre::gate (function *fun)
4240 {
4241   return optimize > 0 && flag_gcse
4242     && !fun->calls_setjmp
4243     && optimize_function_for_speed_p (fun)
4244     && dbg_cnt (pre);
4245 }
4246
4247 } // anon namespace
4248
4249 rtl_opt_pass *
4250 make_pass_rtl_pre (gcc::context *ctxt)
4251 {
4252   return new pass_rtl_pre (ctxt);
4253 }
4254
4255 namespace {
4256
4257 const pass_data pass_data_rtl_hoist =
4258 {
4259   RTL_PASS, /* type */
4260   "hoist", /* name */
4261   OPTGROUP_NONE, /* optinfo_flags */
4262   TV_HOIST, /* tv_id */
4263   PROP_cfglayout, /* properties_required */
4264   0, /* properties_provided */
4265   0, /* properties_destroyed */
4266   0, /* todo_flags_start */
4267   TODO_df_finish, /* todo_flags_finish */
4268 };
4269
4270 class pass_rtl_hoist : public rtl_opt_pass
4271 {
4272 public:
4273   pass_rtl_hoist (gcc::context *ctxt)
4274     : rtl_opt_pass (pass_data_rtl_hoist, ctxt)
4275   {}
4276
4277   /* opt_pass methods: */
4278   virtual bool gate (function *);
4279   virtual unsigned int execute (function *) { return execute_rtl_hoist (); }
4280
4281 }; // class pass_rtl_hoist
4282
4283 bool
4284 pass_rtl_hoist::gate (function *)
4285 {
4286   return optimize > 0 && flag_gcse
4287     && !cfun->calls_setjmp
4288     /* It does not make sense to run code hoisting unless we are optimizing
4289        for code size -- it rarely makes programs faster, and can make then
4290        bigger if we did PRE (when optimizing for space, we don't run PRE).  */
4291     && optimize_function_for_size_p (cfun)
4292     && dbg_cnt (hoist);
4293 }
4294
4295 } // anon namespace
4296
4297 rtl_opt_pass *
4298 make_pass_rtl_hoist (gcc::context *ctxt)
4299 {
4300   return new pass_rtl_hoist (ctxt);
4301 }
4302
4303 /* Reset all state within gcse.c so that we can rerun the compiler
4304    within the same process.  For use by toplev::finalize.  */
4305
4306 void
4307 gcse_c_finalize (void)
4308 {
4309   test_insn = NULL;
4310 }
4311
4312 #include "gt-gcse.h"