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