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