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